你可能知道如何在單個(gè)表上使用 LISTAGG(),但不知道如何在多個(gè)連接表上使用 LISTAGG。此示例演示如何在 Oracle 12g 中對連接的多個(gè)表使用聚合函數(shù)。
假設(shè)我們有以下兩個(gè)表。
“用戶”表
ID | 姓名 |
111 | aaa |
222 | bbb |
333 | bbb |
“記錄”表
ID | 標(biāo)簽 | 價(jià)值 |
111 | start | 1 |
111 | mid | 2 |
111 | end | 3 |
222 | start | 1 |
222 | end | 2 |
333 | start | 1 |
333 | mid | 2 |
333 | start | 3 |
如果我們要選擇所有標(biāo)有“start”和“end”的值,如下圖,sql查詢怎么寫?
預(yù)期結(jié)果:
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;
一個(gè)常見的錯(cuò)誤是缺少最后一個(gè) ?group by
? 子句中的字段。每個(gè)選擇字段也應(yīng)該在 ?group by
? 子句中。在本例中,我們選擇 ?select
? ID 和 Name,因此應(yīng)該使用 ID 和 Name 對結(jié)果進(jìn)行分組。