2016-06-08 81 views
1

我有這三個表在Oracle SQL結合三個表

表A:

code  aname 
----------- ---------- 
1   A 
2   B 
3   C 

表B:

code  bname 
----------- ---------- 
1   aaa 
1   bbb 
2   ccc 
2   ddd 

表C

code  cname 
----------- ---------- 
1   xxx 
1   yyy 
1   zzz 
2   www 

如何我可以使用單個查詢來實現這種輸出嗎?

code  aname  bname  cname 
----------- ---------- ---------- ---------- 
1   A   aaa   xxx 
1   A   bbb   yyy 
1   A   NULL  zzz 
2   B   ccc   www 
2   B   ddd   NULL 
3   C   NULL  NULL 

有什麼建議嗎?

感謝

+0

按照什麼規則將'aaa'與'xxx'結合,而不是'yyy'或'zzz'結合? –

回答

3

它看起來像你想要的「名單」是垂直的表BC。這是可行的,通過使用row_number()。然而,訣竅是在沒有匹配的地方獲得第三排。

以下是一種方法。它使用全外連接將bc名稱組合在一起。然後它使用left join來記錄a記錄。

select a.code, a.name, bc.bname, bc.cname 
from a left join 
    (select coalesce(b.code, c.code) as code, bname, cname 
     from (select code, bname, NULL as cname, 
        row_number() over (partition by code order by code) as seqnum 
      from b 
      ) b full outer join 
      (select code, NULL as bname, cname, 
        row_number() over (partition by code order by code) as seqnum 
      from c 
      ) c 
      on b.code = c.code and b.seqnum = c.seqnum 
    ) bc 
     on bc.code = a.code;