В SQL СЕРВЕР мне нужно вывести данные строки из таблицы при объединении с другой таблицей, а данные столбца во второй таблице должны быть разделены запятыми для каждой первой строки таблицы одним запросом. Если во второй таблице нет совпадающих строк, она должна отображать NULL. Ниже приведены таблицы.
Table 1 Table 2
ID Name Tlb1_ID CITY
1 A 1 ZZ
2 B 1 XX
3 C 2 GG
4 D 2 HH
5 E 3 JJ
Я хочу, чтобы вывод был следующим Результат
ID Name CITY
1 A ZZ,XX
2 B GG,HH
3 C JJ
4 D NULL
5 E NULL
Вы можете использовать function
для возврата значения во второй таблице через запятую. docs.microsoft.com/en-us/sql/t-sql/statements/…
@RyanNghiem, а что входит в эту функцию? Вот о чем вопрос.
STUFF может сделать это, посмотрите на этот пример.
declare @table1 table(ID int, Name varchar(10))
declare @table2 table(ID int, tbl1_ID int, City varchar(10))
insert into @table1 values (1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'), (5, 'E')
insert into @table2 values (1, 1, 'ZZ'), (2, 1, 'XX'), (3, 2, 'GG'), (4, 2, 'HH'), (5, 3, 'JJ')
select t1.ID,
t1.Name,
stuff(( ( select ', ' + t2.City
from @table2 t2
where t2.tbl1_ID = t1.ID
For XML PATH (''))
), 1, 2, '') as Citys
from @table1 t1
результат
ID Name Citys
-- ---- -----
1 A ZZ, XX
2 B GG, HH
3 C JJ
4 D null
5 E null
Попробуйте использовать string_Agg:
SELECT
tbl_1.Id
, tbl_1.Name
, STRING_AGG(tbl_2.City, ', ') AS Cities
FROM @tbl_1 tbl_1
LEFT JOIN @tbl_2 tbl_2
ON tbl_1.Id = tbl_2.Tbl1_Id
GROUP BY tbl_1.Id, tbl_1.Name
и примерные данные:
DECLARE @tbl_1 TABLE
(
Id int,
Name varchar(10)
)
DECLARE @tbl_2 TABLE
(
Tbl1_Id int,
City varchar(10)
)
INSERT INTO @tbl_1
(
Id,
Name
)
VALUES
(1, 'A')
, (2, 'B')
, (3, 'C')
, (4, 'D')
, (5, 'E')
INSERT INTO @tbl_2
(
Tbl1_Id,
City
)
VALUES
( 1, 'ZZ')
, ( 1, 'XX')
, ( 2, 'GG')
, ( 2, 'HH')
, ( 3, 'JJ')
ВЫХОД:
Id Name Cities
1 A ZZ, XX
2 B GG, HH
3 C JJ
4 D NULL
5 E NULL
Subselect вернет название города, разделенное запятыми, для каждого идентификатора. это достигается с помощью for xml path
и stuff
stuff((SELECT ',' + city FROM #tbl2 where #tbl2.Tlb1_ID = t1.ID FOR XML PATH ('')),1,1,'') CITY
Запрос
select
t1.*,
stuff((SELECT ',' + city FROM #tbl2 where #tbl2.Tlb1_ID = t1.ID FOR XML PATH ('')),1,1,'') CITY
from #tbl1 t1
Пожалуйста, добавьте некоторые пояснения к вашему ответу. Из обзора.
Вы спрашиваете, как объединить строки. В SQL Server 2017 и более поздних версиях используйте STRING_AGG. Есть много дубликатов, которые показывают, как сделать то же самое в предыдущих версиях, обычно с использованием
FOR XML