這樣的事情應該工作。在你的實際情況中,你將不需要前兩個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