我有两个表,一个表用于国家(地区),另一个表用于城市,并且我想查询以国家/地区为单位的国家/地区,用逗号分隔所有城市。
注意:
第二个表从第一个表Fk_CountryId
的主键开始是一个外键CityId
,这是一个主键
我正在使用SQL Server
第一个表Country
看起来像这样
CountryId | CountryName
----------+-------------
1 | USA
2 | UK
3 | Germany
第二张表City
看起来像这样
CityId | CityName | Fk_CountryId
-------+------------+-------
1 | Los Angeles| 1
2 | Boston | 1
3 | Cambridge | 2
4 | Chester | 2
5 | Berlin | 3
6 | Hamburg | 3
预期的数据集:
CountryId | CountryName | CitiesNames
----------+--------------+----------------------
1 | USA | Los Angeles, Boston
2 | UK | Cambridge, Chester
3 | Germany | Berlin, Hamburg
答案 0 :(得分:0)
对于旧版本的SQL Server,我会在FOR XML
中使用STUFF()
子句:
SELECT c.CountryId, c.CountryName,
STUFF( (SELECT DISTINCT ' ,'+ct.CityName
FROM City ct
WHERE ct.CountryId = c.CountryId
FOR XML PATH ('')
), 1, 1, ''
) AS CitiesNames
FROM Country c;
您可以将STRING_AGG()
用于更高版本(SQL Server 2017)。但是,如果您没有重复的城市,DISTINCT
在STUFF()
内部是多余的。因此,您可以将其删除。
为了获得更好的性能,您需要索引Country (CountryId)
包括CountryName
,CityName
。