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。这可能是多个技能或根本没有。

这显然不是我正在使用的实际数据,但结构是相同的。

也请随时为这个问题建议一个更好的标题作为评论,因为简洁地表达它是我的问题的一部分。

4

3 回答 3

14

您将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

结果:

| NAME |            SKILLS |
----------------------------
| Bill | Telepathy, Karate |
|  Bob |            (null) |
|  Jim |         Carpentry |
于 2012-12-05T19:47:50.230 回答
5

您正在寻找的是类似于 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 
于 2012-12-05T19:35:31.167 回答
0

您正在寻找的是类似于 SQL Server 的 FOR XML PATH 的东西,它将结果组合为一个行集

于 2012-12-05T19:34:11.173 回答