Combiner plusieurs résultats dans une sous-requête en une seule valeur séparée par des virgules

J'ai deux tables:

TableA ------ ID, Name TableB ------ ID, SomeColumn, TableA_ID (FK for TableA) 

La relation est une ligne de TableA – beaucoup de 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 sortingvial si je fais le traitement du côté client. Mais cela signifie que je TableA 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 cela returnnera plusieurs résultats pour les lignes de TableA .

Je ne suis pas sûr si un UDF, en utilisant COALESCE ou quelque chose de similaire pourrait fonctionner?

    Même cela servira le but

    Exemple de données

     declare @t table(id int, name varchar(20),somecolumn varchar(MAX)) insert into @t select 1,'ABC','X' union all select 1,'ABC','Y' union all select 1,'ABC','Z' union all select 2,'MNO','R' union all select 2,'MNO','S' 

    Question:

     SELECT ID,Name, STUFF((SELECT ',' + CAST(T2.SomeColumn AS VARCHAR(MAX)) FROM @T T2 WHERE T1.id = T2.id AND T1.name = T2.name FOR XML PATH('')),1,1,'') SOMECOLUMN FROM @T T1 GROUP BY id,Name 

    Sortie:

     ID Name SomeColumn 1 ABC X,Y,Z 2 MNO R,S 

    1. Créez le file 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. Utilisez dans la sous-requête:

     SELECT ID, Name, dbo.CombineValues(FK_ID) FROM TableA 

    Je pense que vous êtes sur la bonne voie avec COALESCE. Voir ici un exemple de construction d'une string délimitée par des virgules:

    http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-ssortingng

    Dans MySQL, il y a une fonction group_concat qui returnnera ce que vous requestz.

     SELECT TableA.ID, TableA.Name, group_concat(TableB.SomeColumn) as SomColumnGroup FROM TableA LEFT JOIN TableB ON TableB.TableA_ID = TableA.ID 

    Vous devrez peut-être fournir plus de détails pour une réponse plus précise.

    Étant donné que votre set de données semble plutôt étroit, vous pouvez envisager d'utiliser une ligne par résultat et d'effectuer le post-traitement sur le client.

    Donc, si vous cherchez vraiment à faire que le server fasse le travail, returnnez un jeu de résultats comme

     ID Name SomeColumn 1 ABC X 1 ABC Y 1 ABC Z 2 MNO R 2 MNO S 

    ce qui est bien sûr une simple INNER JOIN sur ID

    Une fois que vous avez de nouveau le jeu de résultats sur le client, maintenez une variable appelée CurrentName et utilisez-la comme triggersur quand arrêter de collecter SomeColumn dans la chose utile que vous voulez faire.

    En supposant que vous avez seulement des clauses WHERE sur la table A, créez une procédure stockée comme suit:

     SELECT Id, Name From tableA WHERE ... SELECT tableA.Id AS ParentId, Somecolumn FROM tableA INNER JOIN tableB on TableA.Id = TableB.F_Id WHERE ... 

    Puis remplissez un DataSet ds avec. alors

     ds.Relations.Add("foo", ds.Tables[0].Columns("Id"), ds.Tables[1].Columns("ParentId")); 

    Enfin, vous pouvez append 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 des données minimales entre la database et le frontend

    J'ai essayé la solution priyanka.sarkar mentionné et le n'a pas tout à fait fonctionner comme OP demandé. Voici la solution que j'ai trouvée:

     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 

    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 changer les jointures

     SELECT t.ID, t.NAME, (SELECT t1.SOMECOLUMN FROM TABLEB t1 WHERE t1.F_ID = T.TABLEA.ID) FROM TABLEA t; 

    Cela fonctionnera pour sélectionner à partir de différentes tables en utilisant la sous-requête.

    J'ai examiné toutes les réponses. Je pense que dans l'insertion de la database devrait être comme:

     ID Name SomeColumn 1. ABC ,X,YZ (these are three different rows) 2. MNO ,R,S 

    La virgule devrait être à la fin précédente et faire la search par comme %,X,%