当前位置: 首页 > 面试题库 >

SQLITE:如果行共享一列,则将它们合并为单行

骆文彬
2023-03-14
问题内容

在上一篇文章中,我在sqlite3中具有以下视图:

CREATE View AttendeeTableView AS

SELECT  (LastName || " " || FirstName) as AttendeeName,  
        CompanyName, 
        PhotoURI,
        CompanyAttendeeRelation.CompanyId,
        CompanyAttendeeRelation.AttendeeId

FROM    Attendee 
JOIN    CompanyAttendeeRelation on CompanyAttendeeRelation.AttendeeId = Attendee.AttendeeId

ORDER BY LastName;

现在,由于数据是根据Attendee和之间的多对多关系生成的Company,因此我可以得到如下结果:

Doe John | company A | johnPic.png | 1 | 15
Doe John | company B | johnPic.png | 2 | 15

我想做的是,如果有一家以上的公司(如上),则创建一个查询,输出:

Doe John | company A company B | johnPic.png | 1 2 | 15

另一个输出:

Doe John | company A | company B | johnPic.png | 1 | 2 | 15

因此,我本质上需要知道如何合并该表中具有不同值的行的特定列。

有任何想法吗?

以防万一,company A company B在第一个查询中显然是文本串联,也就是说,(row1.CompanyName || " " ||row2.CompanyName)


问题答案:

group_concat(X) 为此使用聚合函数:

SELECT (a.LastName || " " || a.FirstName) AS AttendeeName
     , a.PhotoURI
     , group_concat(c.CompanyName) AS Companies
     , group_concat(c.CompanyId)   AS CompanyIds
FROM   Attendee AS a
JOIN   CompanyAttendeeRelation AS ca ON ca.AttendeeId = a.AttendeeId
JOIN   Company                 AS c  ON c.CompanyId = ca.CompanyId
GROUP  BY a.LastName, a.Firstname, a.PhotoURI;

(使用表别名使其更短且更易于阅读。)

NULL值从结果中排除。手册:

所有非NULL值的串联

根据手册,和 中元素顺序
是任意的:CompanyIds``Companies

串联元素的顺序是任意的。

另请注意,“任意”与“随机”不同。group_concat像其他聚合函数一样,按收到的顺序处理行集。没有any ORDER BY,该顺序由执行的查询计划决定。有一个在关系数据库的表中没有的自然顺序(你可以不依赖于插入顺序 在所有
)。但是group_concat(),同一SELECT列表中的的两个实例均以 相同的
顺序处理行,因此in中的第一个IDCompanyIds对应于中的第一个名称Companies

您可以ORDER BY在子查询中强加您的订单。这是实现细节,但极不可能更改。喜欢:

SELECT (LastName || " " || FirstName) AS AttendeeName
     , PhotoURI
     , group_concat(CompanyName) AS Companies
     , group_concat(CompanyId)   AS CompanyIds
FROM  (
   SELECT a.LastName, a.FirstName, a.PhotoURI, c.CompanyName, c.CompanyId
   FROM   Attendee AS a
   JOIN   CompanyAttendeeRelation AS ca ON ca.AttendeeId = a.AttendeeId
   JOIN   Company                 AS c  ON c.CompanyId = ca.CompanyId
   ORDER  BY 1,2,3,4,5  -- or whatever you need
   ) AS sub
GROUP  BY LastName, Firstname, PhotoURI;

关于(可选)序号的手册ORDER BY

如果ORDER BY表达式是常数整数K,则该表达式被视为结果集的第K列的别名(列从1到从左到右编号)。

使用GROUP BY列表作为ORDER BY最佳结果的前导表达式。

在对派生表 进行 排序 ,不要对其进行任何可能重新排列的操作(例如将子查询联接到另一个表等)。



 类似资料:
  • 问题内容: 考虑以下列表: 我该如何实现? 我试过了: 但是,只有当我按一定顺序具有元组的元素时,它才起作用,这意味着它将导致以下结果: 问题答案: 您可以将元组视为图形中的边,而将目标视为在图形中查找连接的组件。然后,您可以简单地遍历顶点(元组中的项),并为尚未访问的每个顶点执行DFS生成组件: 输出: 注意,在上面,组件和组件中的元素都是随机顺序。

  • 问题内容: 我们有些SQL杂语。说我有一个看起来像这样的结果… 61E77D90-D53D-4E2E-A09E-9D6F012EB59C | A 61E77D90-D53D-4E2E-A09E-9D6F012EB59C | B 61E77D90-D53D-4E2E-A09E-9D6F012EB59C | C 61E77D90-D53D-4E2E-A09E-9D6F012EB59C | D 7ce9

  • 问题内容: 我正在尝试不同的JOIN查询,但没有得到想要的结果。 我有2张桌子: 我找不到想要的结果。 我想得到以下结果: 问题答案: 您不能具有这样的动态列数,但是可以 将数据连接 成字符串: 或者您可以使用或手动 旋转行( 我更喜欢后一种方法,对我来说似乎更灵活,但是在某些情况下可以大大减少代码量): 您还可以将前面的语句转换为 动态SQL, 如下所示:

  • 问题内容: 我有第1列和第2列,并希望将它们合并到同一表的第3列中。如果第2列为空,则显示第1列的值;如果第1列为空,则它们显示第2列的数据。如果它们都为空,则显示为空。我尝试了两件事: 1)使用CONCAT 。 仅当两个列都不为null时,它才合并列。否则,它只是将null声明为null。 2)使用(第1栏+第2栏)。 。 没有显示所需的输出。 我正在用Java编写此代码。谢谢 问题答案: us

  • 问题内容: 我有两个查询,每个查询返回一个结果,即一个数字 结果 。 结果 我希望将两个结果合并为一行记录,即 问题答案: 您可以使用: 说明:您可以在select语句中选择单个值作为字段,因此可以编写如下内容: 这仅对 标量 查询有效 ,这意味着子查询应具有精确的1列,最多1行。如果有0行,则ValueFromY将返回,而如果有1行以上,则查询将失败。 (在SQL Server,MySQL和其他

  • 我有两排像这样的, 我希望将它们合并为一个单独的: 不知道如何在熊猫身上做到这一点。任何提示都将受到高度赞赏!提前谢谢