这样的事情应该工作。在你的实际情况中,你将不需要前两个CTE(我为增加测试添加的WITH子句中的子查询)。
with
table1 (dataid, name, factor) as (
select 1, 'Ann' , 1 from dual union all
select 2, 'Kate' , 1 from dual union all
select 3, 'Piter', 1 from dual
),
table2 (dataid, name, factor) as (
select 1, 'John' , 2 from dual union all
select 6, 'Arse' , 2 from dual union all
select 3, 'Garry', 2 from dual
),
u (dataid, name, factor, source) as (
select dataid, name, factor, 1 from table1
union all
select dataid, name, factor, 2 from table2
),
z (dataid, name, factor) as (
select dataid, first_value(name) over (partition by dataid order by source),
factor
from u
)
select dataid, name,
listagg(factor, ',') within group (order by factor) as factor
from z
group by dataid, name
order by dataid
;
输出:
DATAID NAME FACTOR
------- ----- ---------
1 Ann 1,2
2 Kate 1
3 Piter 1,2
6 Arse 2
4 rows selected.
什么第二个表发生了约翰和加里? – mathguy
这并不重要。安和皮特很重要,约翰和加里没有。 – ifuwannaride
然后你不想要一个联盟。请澄清你的要求。你只是简单地为(dataid,factor)做一个UNION,如果它存在,你从第一个表中选择名称,如果不存在,你从第二个表中取出它? – mathguy