【问题标题】:query SQL Aggregate rows inside join查询连接内的 SQL 聚合行
【发布时间】:2023-03-06 01:22:02
【问题描述】:

表:IDPerson_IDName

每个Person ID 可以有多个行,因为他可以有多个名字(名字、姓氏、昵称等)

我有另一个表,其中包含每人一行和其中的一些其他数据

我想将两个表连接成每人 1 行,并在最后一列中将所有人名聚合到一个字符串中,如下所示:“Thomas, anderson, neo”

类似这样的:

SELECT A.*,  
       B.PERSON_ID, 
       B.(aggregated names here) 
  FROM USERS A, USERS_NAMES B;

我该怎么做?

【问题讨论】:

  • 请提供一些示例数据行和所需的结果。我不明白你在问什么。另外,不要使用隐式连接。
  • 你用的是什么关系型数据库?

标签: sql oracle


【解决方案1】:

我会这样做:

select u.*, un.names
from users u left outer join
     (select un.person_id, listagg(un.name, ',') within group (order by un.id) as names
      from users_names un
      group by un.person_id
     ) un
     on u.person_id = un.person_id;

请注意,列表聚合是在子查询中完成的。这允许在没有聚合的外部查询中使用u.*。否则,您必须明确group by users 中的每一列。

【讨论】:

  • 我喜欢这个逻辑,投了赞成票。但与没有子查询选项相比,它会影响性能吗?
  • @亚历山大。 . .对性能的影响可能可以忽略不计,因为您要选择所有行。可能会更好,也可能会更糟。如果没有子查询,您最终会聚合更多列。
猜你喜欢
  • 2011-12-15
  • 2023-02-03
  • 2012-09-28
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多