sql - 从单列中选择多行到单行

标签 sql sql-server

我想编写一个 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

因此,对于每个人,我想要一个以逗号连接的列表,其中包含指向他的所有 SkillName。这可能是多种技能或根本没有。

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

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

最佳答案

为此,您可以使用 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 |

关于sql - 从单列中选择多行到单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13730484/

相关文章:

sql - 条件纯sql查询

sql - 组织.Apache.calcite.runtime.CalciteException : Failed to encode '全国' in character set 'ISO-8859-1'

mysql - SQL语句用变量测试外键字段?

SQL LEFT JOIN 仅第一行

SQL:仅比较日期与月份和年份列

android - select 中的 Ormlite 子查询

mysql - 如何找到学生的 sibling

java - 将数据类型 Hierarchyid 从 SQL Server 迁移到 Oracle VARCHAR2

SQL 2005 - 查询查找行数最多的表

sql-server - 您能否创建 CLR UDT 以允许跨数据库共享表类型?