2014-10-27 121 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),返回所需的字符串寫入功能。所以在你的選擇中使用它。在你的問題鏈接有很好的例子,如何做到這一點。