2014-10-27 120 views
0

这与此类似。 How to concatenate all columns in a select with SQL ServerSELECT语句中的sql concat

但不完全。这是MS SQL 2008.我拉着病人的人口统计数据,其中之一是种族,这是一个多选题领域(例如,你可能是亚洲人和中国人)。比赛表'PatientRace'通过病人与病人表相关联。所以表结构是这样的:

Patient table 
PatientID 
PatientName 
PatientAddress 

PatientRace table 
PatientRaceID 
PatientID (FK) 
Description 

我只想要一行,我想要比赛连接。有可能在单个SELECT语句中执行此操作,还是需要执行游标?我设想游标是这样的:初始选择所有其他人口统计信息,插入临时表。通过patientID浏览临时表,然后分别获取比赛,concat,并添加到临时表中。

期望的输出是这样的:每个病人1行。

名称: “乔吹”

种族: “亚洲,中国”

+0

对不起,但是“亚洲华人”不是一场比赛。 – arkascha 2014-10-27 20:17:04

+0

有一个问题。在PatientRace表格中代表什么意思? – AndreDuarte 2014-10-27 20:17:13

+1

你应该为'Patient'表添加一个'RaceId',并且用'Id'和'Description'添加另一个表'Race'。在你的解决方案中,你将拥有大量的单项比赛参赛项目。 – AndreDuarte 2014-10-27 20:19:58

回答

2

串联字符串值不明显。它需要使用“XML”的数据处理和子查询:

select p.*, 
     stuff((select ', ' + Description 
       from patientrace pr 
       where pr.patientid = p.patientid 
       for xml path ('') 
      ), 1, 2, '' 
      ) as races 
from patients p; 
5

你需要使用的东西,FOR XML就像SQL Server的本

SELECT p.PatientName, 
     (STUFF(SELECT ',' + r.Description 
      FROM PatientRace r 
      WHERE r.PatientID = p.PatientID 
      FOR XML('')), 1, 1, '') 
FROM Patients p 
+1

请注意这一点,因为如果没有'TYPE',你可能会遇到带有XML实体的丑陋东西(怀疑在这种情况下,字符串中会有像'<和'&这样的字符,但这可能不适用于所有人读者)。我在[这篇文章中]讨论了这个问题(http://sqlperformance.com/2014/08/t-sql-queries/sql-server-grouped-concatenation)。 – 2014-10-27 20:28:21

1

至于我,你有一个像fn_GetRaceByID(INT PatientID),返回所需的字符串写入功能。所以在你的选择中使用它。在你的问题链接有很好的例子,如何做到这一点。