2012-12-05 63 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