首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将单个表中重复行的值连接在一起的SQL查询

问将单个表中重复行的值连接在一起的SQL查询
EN

Database Administration用户
提问于 2011-07-20 07:28:03
回答 2查看 23.2K关注 0票数 5

假设我有一个employees表,如下所示:

代码语言:javascript
复制
Name     Sex     Role

Bob      M       Developer
Joe      M       QA

现在,我对这个表中重复的行有一个问题。总有一天我会修好的,但这不是问题。我目前需要的是查询这样一个表的东西:

代码语言:javascript
复制
Name     Sex     Role

Bob      M       Developer
Bob      M       Janitor
Joe      M       QA
Joe      M       CEO

并输出以下行:

代码语言:javascript
复制
Name     Role

Bob      Developer, Janitor
Joe      QA, CEO

对于我来说,“角色”是被分割成单独的列,还是是一个具有多个值的列,这都不重要。

如果有关系,可以使用Server 2008。

EN

回答 2

Database Administration用户

回答已采纳

发布于 2011-07-20 15:12:26

Group_concat和MySQL一样,在Server中直到2016年是不可用的。然而,vNext将引入STRING_AGG,这将提供同等的功能。

不过,您有一些手动选项:

  • 构建一个标量函数,该函数以employee name/id为参数,并显示连接的角色值,并将此函数应用于每个员工
  • 使用xml函数
  • 使用已建集料 (类似于第一个选项)

解决当前情况的一个解决方案(刚刚从SO中获取Brad的答案并为您的表定制)将是:

代码语言:javascript
复制
SELECT name, LEFT(roles , LEN(roles )-1) AS roles
FROM employee AS extern
CROSS APPLY
(
    SELECT role + ','
    FROM employee AS intern
    WHERE extern.name = intern.name
    FOR XML PATH('')
) pre_trimmed (roles)
GROUP BY name, roles;

这些细节是从不同的来源收集的:

票数 7
EN

Database Administration用户

发布于 2011-07-20 08:00:44

我会尝试使用以下方法,但请注意,这可以在非常大的表上运行相当长的时间。

代码语言:javascript
复制
select a.name, a.role, b.role from employees a, employees b where a.name=b.name and a.role<>b.role

我将表命名为"employees“,并将列命名为"name”和"role“。

票数 -1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/3965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档