你可能知道如何在单个表上使用 LISTAGG(),但不知道如何在多个连接表上使用 LISTAGG。此示例演示如何在 Oracle 12g 中对连接的多个表使用聚合函数。
假设我们有以下两个表。
“用户”表
ID | 姓名 |
111 | aaa |
222 | bbb |
333 | bbb |
“记录”表
ID | 标签 | 价值 |
111 | start | 1 |
111 | mid | 2 |
111 | end | 3 |
222 | start | 1 |
222 | end | 2 |
333 | start | 1 |
333 | mid | 2 |
333 | start | 3 |
如果我们要选择所有标有“start”和“end”的值,如下图,sql查询怎么写?
预期结果:
ID | 姓名 | 聚合值 |
111 | aaa | 1,3 |
222 | bbb | 1,2 |
333 | bbb | 1,3 |
select u.ID, u.Name, listagg(Value, ', ') within group (order by Tag) as AggValues
from User u
left outer join Record r
on u.ID = r.ID and r.Tag in ('start', 'end')
group by u.ID, u.Name;
一个常见的错误是缺少最后一个 group by
子句中的字段。每个选择字段也应该在 group by
子句中。在本例中,我们选择 select
ID 和 Name,因此应该使用 ID 和 Name 对结果进行分组。