首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >不带子查询的分组列分组

不带子查询的分组列分组
EN

Stack Overflow用户
提问于 2019-02-26 16:05:53
回答 3查看 68关注 0票数 2

我认为用一个例子可以更容易地解释这一点,所以假设我们有这样一个数据库:

  • 第一个表是Interventions,它存储Id和它需要的任何东西。
  • 第二个是Doctors
  • 第三个是Tools
  • 第四个是N表,它将每次干预与其所有的医生匹配,我们称之为DoctorsOnInterventions
  • 第五个表是另一个N表,它匹配在每次干预中使用的每个工具,我们称之为ToolsOnInterventions

好吧,现在我们可以:

代码语言:javascript
运行
复制
SELECT InterventionId, STRING_AGG(Doctors.Name, ', ')
FROM Interventions
INNER JOIN Doctors ON Doctors.Id = DoctorsOnInterventions.DoctorId
GROUP BY Intervention.Id, Doctors.Id;

并得到:

代码语言:javascript
运行
复制
+-----------------+------------+
| InterventionId  |  Doctors   |
+-----------------+------------+
|               1 | Tom, John  |
|               2 | Tom, Homer |
+-----------------+------------+

但是我们需要增加另一个专栏,就像医生一样,但是在干预中使用的工具是这样的:

代码语言:javascript
运行
复制
+-----------------+------------+-----------------+
| InterventionId  |  Doctors   |      Tools      |
+-----------------+------------+-----------------+
|               1 | Tom, John  | Scalpel, Hammer |
|               2 | Tom, Homer | Hammer, Bulb    |
+-----------------+------------+-----------------+

将前面的代码包装在子查询上,然后再创建另一个group by是很容易的,但是我想知道是否有更正确的方法来实现这一点,因为我的数据库表有几十个列。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-26 18:25:23

代码语言:javascript
运行
复制
SELECT InterventionId, STRING(Doctors.Name, ', '),STRING(Tools.name,',')
FROM Interventions
INNER JOIN Doctors ON Doctors.Id = DoctorsOnInterventions.DoctorId 
INNER JOIN Tools on tools.id = ToolsOnInterventions.toolsid
GROUP BY Intervention.Id, Doctors.Id, tools.id; 
票数 0
EN

Stack Overflow用户

发布于 2019-02-26 16:13:30

您可以使用string_agg()。我建议使用子查询;可以使用apply

代码语言:javascript
运行
复制
SELECT i.*, d.doctors, t.tools
FROM Interventions i OUTER APPLY
     (SELECT STRING_AGG(d.name, ',') as doctors
      FROM DoctorsOnInterventions doi JOIN
           Doctors d
           ON d.Id = doi.DoctorId
      WHERE doi.interventionId = i.id
     ) d OUTER APPLY
     (SELECT STRING_AGG(t.name, ',') as tools
      FROM ToolsOnInterventions toi JOIN
           Tools t
           ON t.id = toi.ToolId
      WHERE toi.interventionId = i.id
     ) t ;

在Server的旧版本中,可以使用字符串连接的FOR XML PATH方法。

票数 0
EN

Stack Overflow用户

发布于 2019-02-26 16:19:08

我想你需要另一张桌子。

表式干预

代码语言:javascript
运行
复制
+-----------------+------------+
| InterventionId  |  Doctors   |
+-----------------+------------+
|               1 | Tom, John  |
|               2 | Tom, Homer |
+-----------------+------------+

表工具

代码语言:javascript
运行
复制
+-----------------+----------------+
| InterventionId  |  Doctors       |
+-----------------+----------------+
|               1 | Scalpel, Hammer|
|               2 | Hammer, Bulb   |
+-----------------+----------------+

表Interventions_tool ()

代码语言:javascript
运行
复制
+-----------------+------------+
| InterventionId  |  ToolId    |
+-----------------+------------+
|               1 | 1          |
|               2 | 2          |
+-----------------+------------+

查询将是

代码语言:javascript
运行
复制
SELECT InterventionId, STRING(Doctors.Name, ', ')
FROM Interventions I WITH (NOLOCK)
INNER JOIN Doctors D WITH (NOLOCK) ON D.Id = I.DoctorId
INNER JOIN Interventions_tool IT WITH (NOLOCK) ON I.Id = IT.ToolId
GROUP BY I.Id, D.Id;

+-----------------+------------+-----------------+
| InterventionId  |  Doctors   |      Tools      |
+-----------------+------------+-----------------+
|               1 | Tom, John  | Scalpel, Hammer |
|               2 | Tom, Homer | Hammer, Bulb    |
+-----------------+------------+-----------------+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54889632

复制
相关文章

相似问题

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