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.