2012-12-05 60 views
2

我想寫一個SQL Server查詢將從下面的示例表中檢索數據:選擇單列多行分爲單列

Table: Person 
ID  Name 
--  ---- 
1  Bill 
2  Bob 
3  Jim 

Table: Skill 
ID  SkillName 
--  ----- 
1  Carpentry 
2  Telepathy 
3  Navigation 
4  Opera 
5  Karate 

Table: SkillLink 
ID  PersonID  SkillID 
--  --------  ------- 
1  1    2 
2  3    1 
3  1    5 

正如你所看到的,SkillLink表的目的是爲了適應不同的(可能有多個或沒有)個人技能。我想實現我的查詢結果是:

Name Skills 
---- ------ 
Bill Telepathy,Karate 
Bob  
Jim  Carpentry 

因此,對於每個個人,我想用逗號連接指着他所有SkillNames的名單。這可能是多種技能或根本沒有。

這顯然不是我正在使用的實際數據,但結構是相同的。

也請隨意爲這個問題提出一個更好的標題作爲評論,因爲措辭簡潔是我的問題的一部分。

+1

可能重複(http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single -text-string) – Taryn

+0

從標題中你可能會想到,但正如你所看到的那樣,這不太正確。我想將多行連接成單個文本字符串,並根據第三個表將它們與他們的人員配對。我正在尋找這樣做的所有*的查詢,而不僅僅是連接。 – radicalbiscuit

+1

回覆:問題標題 - 您可以省略「SQL查詢」,就像標籤中顯而易見的那樣,並將「組合」更改爲「選擇」。 –

回答

13

你會使用FOR XML PATH此:

select p.name, 
    Stuff((SELECT ', ' + s.skillName 
     FROM skilllink l 
     left join skill s 
      on l.skillid = s.id 
     where p.id = l.personid 
     FOR XML PATH('')),1,1,'') Skills 
from person p 

SQL Fiddle with Demo

結果:

| NAME |   SKILLS | 
---------------------------- 
| Bill | Telepathy, Karate | 
| Bob |   (null) | 
| Jim |   Carpentry | 
的[?串聯多行成一個單一的文本字符串]
+0

'.value('text()[1]','nvarchar(max)')'是不必要的。如果您擔心沒有足夠的空間存儲數據類型,那麼在'skillName'上執行'CAST' /'CONVERT'到'varchar(max)'。 IE:'SELECT','+ CAST(s.SillName AS VARCHAR(MAX))...' – SPFiredrake

+0

不,我的意思是你不需要',TYPE).value('。','NVARCHAR(MAX) ')'部分在'FOR XML PATH'之後。請參閱http://sqlfiddle.com/#!3/2e1f4/9 – SPFiredrake

+0

@SPFiredrake修復。 :)它是漫長的一天 – Taryn

0

你在找什麼東西像SQL Server的FOR XML PATH 相結合的結果行集

4

你所尋找的是類似SQL Server的FOR相結合的結果作爲一個XML PATH(「」)行集

Select Person.Name, 
    (
    Select SkillName + ',' 
    From SkillLink 
    inner join skill on skill.id = skilllink.skillid 
    Where SkillLink.PersonID = Person.ID FOR XML PATH('') 
) 
as Skills 
FROM Person 
+0

請使用給定示例中的表名和列名。 – radicalbiscuit

+0

恩我做到了,對不起 –

+1

這個工程,我真的很喜歡簡單。但是,結果包括不必要的逗號。由於寫得更清楚,結果更清晰,我將與bluefeet的答案一起進行討論,但是我想感謝你給我一個工作答案! – radicalbiscuit