【FULL OUTER JOIN】全外連線的union all改寫方法

不一樣的天空w發表於2017-03-09
對於SQL中的連線操作在實現業務需求的時候比較方便和高效,這裡針對“全外連線”展示一下在Oracle中的幾種寫法。
每種寫法因人而異,以滿足需求為目的。

有關內連線,左連線和右連線的簡單演示請參考:《【實驗】內連線,左連線,右連線,全外連線》http://space.itpub.net/519536/viewspace-563019

1.建立實驗表並初始化實驗資料
SQL> create table a (a number(1),b number(1),c number(1));
SQL> create table b (a number(1),d number(1),e number(1));
SQL> insert into a values(1,1,1);
SQL> insert into a values(2,2,2);
SQL> insert into a values(3,3,3);
SQL> insert into b values(1,4,4);
SQL> insert into b values(2,5,5);
SQL> insert into b values(4,6,6);
SQL> commit;

2.檢視一下初始化資料內容
sec@ora10g> select * from a;

         A          B          C
---------- ---------- ----------
         1          1          1
         2          2          2
         3          3          3

sec@ora10g> select * from b;

         A          D          E
---------- ---------- ----------
         1          4          4
         2          5          5
         4          6          6

3.第一種寫法,這也是標準SQL的寫法。功能明確,不過理解有點小障礙。
sec@ora10g> select * from a full outer join b on a.a = b.a;

         A          B          C          A          D          E
---------- ---------- ---------- ---------- ---------- ----------
         1          1          1          1          4          4
         2          2          2          2          5          5
         3          3          3
                                          4          6          6

4.第二種寫法
思路:“a到b的全外連線”=“a到b的內連線” + “b到a的反連線” + “a到b的反連線”。

sec@ora10g> select *
  2    from a, b
  3   where a.a = b.a
  4  union all
  5  select *
  6    from a, b
  7   where a.a(+) = b.a
  8     and a.a is null
  9  union all
 10  select *
 11    from a, b
 12  where a.a = b.a(+)
 13     and b.a is null
 14  /

         A          B          C          A          D          E
---------- ---------- ---------- ---------- ---------- ----------
         1          1          1          1          4          4
         2          2          2          2          5          5
                                          4          6          6
         3          3          3

5.第三種寫法
思路:“a到b的全外連線”=“b到a的外部連線” + “a到b的反連線”。
sec@ora10g> select *
  2    from a, b
  3   where a.a(+) = b.a
  4  union all
  5  select *
  6    from a, b
  7   where a.a = b.a(+)
  8     and b.a is null
  9  /

         A          B          C          A          D          E
---------- ---------- ---------- ---------- ---------- ----------
         1          1          1          1          4          4
         2          2          2          2          5          5
                                          4          6          6
         3          3          3


6.小結
注意,改寫方法中的“union all”也可以修改為“union”,之所以上面改寫方法中我們使用union all,原因是出於效能方便的考慮,union all的執行效率遠大於union操作

這裡展示的是一種轉換思路,
可一看了之。

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2134987/,如需轉載,請註明出處,否則將追究法律責任。

相關文章