在单行中显示结果数据,无论Sql server中的列数如何

在单行中显示结果数据,无论Sql server中的列数如何,sql,sql-server,Sql,Sql Server,我有这样的疑问 select StateName ,countryName from country_master left join state_master on country_master.countryID = state_master.countryID 产生了以下结果, 印度古吉拉特邦印度德里 HR印度MP印度 美国纽约州美国洛杉矶 芝加哥美国WDC美国伦敦英国 我希望这个结果在单行中,其关系如下 印度-古吉拉特邦德里人力资源部议员美国 -纽约-芝加哥-伦敦 您对构建此查询有何想

我有这样的疑问

select StateName ,countryName
from country_master left join state_master on country_master.countryID = state_master.countryID
产生了以下结果,

印度古吉拉特邦
印度德里
HR印度
MP印度
美国纽约州
美国洛杉矶
芝加哥美国
WDC美国
伦敦英国

我希望这个结果在单行中,其关系如下

印度-古吉拉特邦德里人力资源部议员
美国 -纽约-芝加哥-伦敦

您对构建此查询有何想法
建议我,
谢谢,

这个问题本质上是重复的

以下是一种在Sql Server 2008中有效的方法:

WITH Ranked ( countryID, rnk, stateName )  
         AS ( SELECT countryID,
                     ROW_NUMBER() OVER( PARTITION BY countryID ORDER BY countryID ),
                     CAST( stateName AS VARCHAR(8000) ) 
                FROM state_master),
AnchorRanked ( countryID, rnk, stateName )  
         AS ( SELECT countryID, rnk, stateName 
                FROM Ranked
               WHERE rnk = 1 ),
RecurRanked ( countryID, rnk, stateName ) 
         AS ( SELECT countryID, rnk, stateName 
                FROM AnchorRanked
               UNION ALL 
              SELECT Ranked.countryID, Ranked.rnk,
                     RecurRanked.stateName + ', ' + Ranked.stateName
                FROM Ranked
               INNER JOIN RecurRanked 
                  ON Ranked.countryID = RecurRanked.countryID 
                 AND Ranked.rnk = RecurRanked.rnk + 1 )
SELECT countryName, MAX( stateName ) 
  FROM RecurRanked
  INNER JOIN country_master on RecurRanked.countryID = country_master.countryID
 GROUP BY countryName;
您可以在这里看到几种实现这种技术的方法:


如果您的串联城市列表将超过8000个字符,您需要小心,尽管如果这是一个问题,您可能可以不使用varchar(max)之类的操作(除了这可能不是查看数据的好方法之外).

你应该回去接受你过去问题的正确答案。在应该得到表扬的地方给予表扬既有礼貌,也对将来有类似问题的其他人有用,因为这有助于他们快速找到正确答案。
Select t.countryName , isnull(Stuff((SELECT ', ' + StateName
          FROM state_master where countryID = t.countryID
          ORDER BY StateName
          For XML PATH ('')),1,1,''),'') as c
from country_master  t 
select c.countryName,
       stuff((select ' '+s.StateName
              from state_master as s
              where s.countryID = c.countryID
              for xml path(''), type).value('.', 'nvarchar(max)'), 1, 1, '')
from country_master as c