Oracle SQL-将同一列中的值合并到多个表的结果集中的一列中
我很想知道如何将同一列中的多条记录从两个不同的表集中到一个表中。例如,下面是我的表格: 注表:Oracle SQL-将同一列中的值合并到多个表的结果集中的一列中,sql,oracle,plsql,Sql,Oracle,Plsql,我很想知道如何将同一列中的多条记录从两个不同的表集中到一个表中。例如,下面是我的表格: 注表: 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 我可以运行此查询并
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
查询
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
Oracle的哪个版本?查看11g+上的
listag()
。只要连接的注释不超过您版本的限制。是12.1。我将尝试Listag()。可能是重复的谢谢。但是如果我有很多记录和很多笔记呢。我必须选择每个记录及其备注吗?with
仅用于样本在数据库中尝试:select INV.INVOICE,INV.AMOUNT,listag(notes.notes,,)(按INV.INVOICE订购,INV.AMOUNT)INVOICE INVOICE的备注内部连接INVOICE上的备注=notes.INVOICE GROUP BY INV.INVOICE,INV.AMOUNT