J'ai deux tables:
TableA
------
ID,
Name
TableB
------
ID,
SomeColumn,
TableA_ID (FK for TableA)
La relation est une rangée de TableA
- plusieurs TableB
.
Maintenant, je veux voir un résultat comme celui-ci:
ID Name SomeColumn
1. ABC X, Y, Z (these are three different rows)
2. MNO R, S
Cela ne fonctionnera pas (plusieurs résultats dans une sous-requête):
SELECT ID,
Name,
(SELECT SomeColumn FROM TableB WHERE F_ID=TableA.ID)
FROM TableA
C'est un problème trivial si je fais le traitement côté client. Mais cela signifie que je devrai exécuter des requêtes X sur chaque page, où X est le nombre de résultats de TableA
.
Notez que je ne peux pas simplement faire un GROUP BY ou quelque chose de similaire, car il renverra plusieurs résultats pour les lignes de TableA
.
Je ne sais pas si un UDF, utilisant COALESCE ou quelque chose de similaire pourrait fonctionner?
sql-server
tsql
join
Donnie Thomas
la source
la source
1. Créez l'UDF:
CREATE FUNCTION CombineValues ( @FK_ID INT -- The foreign key from TableA which is used -- to fetch corresponding records ) RETURNS VARCHAR(8000) AS BEGIN DECLARE @SomeColumnList VARCHAR(8000); SELECT @SomeColumnList = COALESCE(@SomeColumnList + ', ', '') + CAST(SomeColumn AS varchar(20)) FROM TableB C WHERE C.FK_ID = @FK_ID; RETURN ( SELECT @SomeColumnList ) END
2. Utilisation dans la sous-requête:
SELECT ID, Name, dbo.CombineValues(FK_ID) FROM TableA
3. Si vous utilisez une procédure stockée, vous pouvez procéder comme suit:
CREATE PROCEDURE GetCombinedValues @FK_ID int As BEGIN DECLARE @SomeColumnList VARCHAR(800) SELECT @SomeColumnList = COALESCE(@SomeColumnList + ', ', '') + CAST(SomeColumn AS varchar(20)) FROM TableB WHERE FK_ID = @FK_ID Select *, @SomeColumnList as SelectedIds FROM TableA WHERE FK_ID = @FK_ID END
la source
Je pense que vous êtes sur la bonne voie avec COALESCE. Voir ici pour un exemple de construction d'une chaîne délimitée par des virgules:
http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string
la source
Dans MySQL, il existe une fonction group_concat qui retournera ce que vous demandez.
SELECT TableA.ID, TableA.Name, group_concat(TableB.SomeColumn) as SomColumnGroup FROM TableA LEFT JOIN TableB ON TableB.TableA_ID = TableA.ID
la source
Vous devrez peut-être fournir plus de détails pour une réponse plus précise.
Étant donné que votre ensemble de données semble assez étroit, vous pouvez envisager d'utiliser simplement une ligne par résultat et d'effectuer le post-traitement chez le client.
Donc, si vous cherchez vraiment à faire faire le travail au serveur, renvoyez un jeu de résultats comme
qui est bien sûr un simple INNER JOIN sur ID
Une fois que vous avez le résultat sur le client, maintenez une variable appelée CurrentName et utilisez-la comme déclencheur pour arrêter de collecter SomeColumn dans la chose utile que vous voulez qu'elle fasse.
la source
En supposant que vous n'avez que des clauses WHERE sur la table A, créez une procédure stockée ainsi:
SELECT Id, Name From tableA WHERE ... SELECT tableA.Id AS ParentId, Somecolumn FROM tableA INNER JOIN tableB on TableA.Id = TableB.F_Id WHERE ...
Remplissez ensuite un DataSet ds avec. ensuite
Enfin, vous pouvez ajouter un répéteur dans la page qui met les virgules pour chaque ligne
<asp:DataList ID="Subcategories" DataKeyField="ParentCatId" DataSource='<%# Container.DataItem.CreateChildView("foo") %>' RepeatColumns="1" RepeatDirection="Horizontal" ItemStyle-HorizontalAlign="left" ItemStyle-VerticalAlign="top" runat="server" >
De cette façon, vous le ferez côté client mais avec une seule requête, en passant un minimum de données entre la base de données et le frontend
la source
J'ai essayé la solution mentionnée par priyanka.sarkar et je n'ai pas tout à fait fonctionné comme le PO l'a demandé. Voici la solution avec laquelle j'ai abouti:
SELECT ID, SUBSTRING(( SELECT ',' + T2.SomeColumn FROM @T T2 WHERE WHERE T1.id = T2.id FOR XML PATH('')), 2, 1000000) FROM @T T1 GROUP BY ID
la source
Solution ci-dessous:
SELECT GROUP_CONCAT(field_attr_best_weekday_value)as RAVI FROM content_field_attr_best_weekday LEFT JOIN content_type_attraction on content_field_attr_best_weekday.nid = content_type_attraction.nid GROUP BY content_field_attr_best_weekday.nid
Utilisez ceci, vous pouvez également modifier les jointures
la source
SELECT t.ID, t.NAME, (SELECT t1.SOMECOLUMN FROM TABLEB t1 WHERE t1.F_ID = T.TABLEA.ID) FROM TABLEA t;
Cela fonctionnera pour la sélection dans une table différente en utilisant une sous-requête.
la source
J'ai passé en revue toutes les réponses. Je pense que l'insertion de base de données devrait être comme:
La virgule doit être à la fin précédente et faire une recherche par like
%,X,%
la source