sql-server - virgule - sql tronquer nombre




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

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 trivial 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 retournera 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?


1. Créez le fichier 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

3. Si vous utilisez une procédure stockée, vous pouvez faire comme ceci:

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

Dans MySQL, il y a 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

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

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

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

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


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

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.





join