2016-08-02 140 views
0

我有兩個表:聯盟合併不同列

Table1

DATAID| NAME | FACTOR 

1 | Ann | 1 
2 | Kate | 1 
3 | Piter | 1 

Table2

DATAID| NAME | FACTOR 

1 | John | 2 
6 | Arse | 2 
3 | Garry | 2 

我想UNION這些表,並得到這樣的結果:

DATAID| NAME | FACTOR 

1 | Ann  | 1,2 
2 | Kate | 1 
3 | Piter | 1,2 
6 | Arse | 2 

因此,當有2行與同一數據ID,我想獲得從表1「姓名」列和某種聚合因子,例如「1,2」或3

+2

什麼第二個表發生了約翰和加里? – mathguy

+0

這並不重要。安和皮特很重要,約翰和加里沒有。 – ifuwannaride

+0

然後你不想要一個聯盟。請澄清你的要求。你只是簡單地爲(dataid,factor)做一個UNION,如果它存在,你從第一個表中選擇名稱,如果不存在,你從第二個表中取出它? – mathguy

回答

1

一種方法是使用listagg()

select dataid, name, 
     listagg(factor, ',') within group (order by factor) as factors 
from ((select dataid, name, factor from table1 t1 
    ) union all 
     (select dataid, name, factor from table2 t2 
    ) 
    ) t 
group by dataid, name; 

注:我注意到名稱是而不是對於給定的id是相同的。您可以使用聚合功能選擇一個。

或者,如果你只有一個行中的每個表,你可以使用一個full outer join

select coalesce(t1.dataid, t2.dataid) as dataid, 
     coalesce(t1.name, t2.name) as name, 
     trim(leading ',' from coalesce(',' || t1.factor, ',') || coalesce(',' || t2.factor, '') as factors 
from t1 full outer join 
    t2 
    on t1.dataid = t2.dataid; 
+0

您是否注意到OP表中的工會(或工會全部)與他/她的意圖輸出不匹配? – mathguy

+0

[編輯完成後]完整的外連接不起作用,他/她對兩個表中的相同ID有不同的名稱,並且希望先選擇table1中的內容;一個聚合函數也不會工作(沒有額外的工作)。 – mathguy

+0

mathguy,正好。 – ifuwannaride

0

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