2016-08-02 3 views
0

異なる列をマージ:私はUNIONこれらのテーブルを好きで、この結果を得るでしょう連合は私は2つのテーブル持って

DATAID| NAME | FACTOR 

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

Table1

DATAID| NAME | FACTOR 

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

Table2

DATAID| NAME | FACTOR 

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

だから、同じデータIDを持つ2行があるとき、私は例えば、表1および集約FACTORのいくつかの種類から「NAME」列を取得したいと思い「1,2」または3

+2

第二のテーブルからジョンとギャリーに何が起こりましたか? – mathguy

+0

は関係ありません。アンとピーターの問題は、ジョンとギャリーはしません。 – ifuwannaride

+0

次にUNIONは必要ありません。あなたの要件を明確にしてください。単純に(dataid、factor)のUNIONを実行していて、最初のテーブルが存在する場合はそれを選択し、存在しない場合は2番目のテーブルから取ります。 – 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と同じ名前のではなく、であることがわかりました。集計関数を使用して1つを選択できます。

それとも、あなただけの各テーブルに1行を持っている場合は、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

[編集後:]完全な外部結合は機能しません。2つのテーブルの同じIDに対して異なる名前を持ち、最初にtable1にあったものを選択したいと考えています。集計関数は(余分な作業なしで)どちらも機能しません。 – mathguy

+0

mathguy、正確に。 – ifuwannaride

0

何かが動作するはずです。実際の状況では、最初の2つの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. 
関連する問題