Oracle SQL - 结合多个表结果集中一列中同一列中的值

问题描述:

我想知道如何将来自同一列的多个记录从两个不同的表中合并到一个表中。例如下面是我的表:Oracle SQL - 结合多个表结果集中一列中同一列中的值

注表:

INVOICE NOTES 
1000 REPLACE PUMP 
1000 REPLACE OIL 
1000 REPLACE FILTER 
1111 WO# 123 
1111 REPLACE GASKET 
1234 REPLACE OIL 

发票表:

INVOICE AMOUNT 
1000 100 
1111 50 
1234 20 

我可以运行此查询,并将结果:

SELECT INV.INVOICE, INV.AMOUNT FROM INVOICE INV 
INNER JOIN NOTES ON INV.INVOICE = NOTES.INVOICE 

但我会比如将结果集中一列中的每张发票的注释合并在一起。对于例子我的结果应该是这样的

INVOICE AMOUNT  NOTES 
1000  100  REPLACE PUMP, REPLACE OIL, REPLACE FILTER 
1111  50   WO# 123,REPLACE GASKET 
1234  20   REPLACE OIL 
+2

哪个Oracle的版本?看看11g +上的listagg()。只要连接的笔记不超过您的版本的限制。 [另见本文](https://oracle-base.com/articles/misc/string-aggregation-techniques)。 –

+0

它是12.1。我会尝试listagg()。 – jax

+0

[SQL查询来连接Oracle中多行的列值]的可能重复(https://stackoverflow.com/questions/4686543/sql-query-to-concatenate-column-values-from-multiple-rows-in- oracle) –

documentation - listagg

查询

with inv_notes as 
(select 1000 as INVOICE, 'REPLACE PUMP' as notes from dual union all 
select 1000, 'REPLACE PUMP' from dual union all 
select 1000, 'REPLACE OIL' from dual union all 
select 1000, 'REPLACE FILTER' from dual union all 
select 1111, 'WO# 123' from dual union all 
select 1111, 'REPLACE GASKET' from dual union all 
select 1234, 'REPLACE OIL' from dual 
) 
, 
inv_amount as (
select 1000 as INVOICE, 100 AMOUNT from dual union all 
select 1111, 50 from dual union all 
select 1234, 20 from dual) 
select a.invoice, a.amount, listagg(n.notes, ',') WITHIN GROUP (ORDER BY a.invoice, a.amount) notes 
from inv_notes n 
inner join inv_amount a on n.invoice = a.invoice 
group by a.invoice, a.amount 

结果

1 1000 100 REPLACE FILTER,REPLACE OIL,REPLACE PUMP,REPLACE PUMP 
2 1111 50 REPLACE GASKET,WO# 123 
3 1234 20 REPLACE OIL 
+0

谢谢。但是如果我有很多记录和很多笔记呢。我必须用他们的笔记选择每个记录吗? – jax

+0

'with'仅适用于样本 – are

+1

请在您的数据库中尝试以下代码:'SELECT INV.INVOICE,INV.AMOUNT,listagg(NOTES.notes,',')WITHIN GROUP(ORDER BY INV.INVOICE,INV.AMOUNT)笔记 FROM INVOICE INV IN.IN JOIN NOTES ON INV.INVOICE = NOTES.INVOICE group by INV.INVOICE,INV.AMOUNT' – are