【FULL OUTER JOIN】全外連線的union all改寫方法
對於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 --
每種寫法因人而異,以滿足需求為目的。
有關內連線,左連線和右連線的簡單演示請參考:《【實驗】內連線,左連線,右連線,全外連線》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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 理解full outer jion,union,union all
- `FULL JOIN` 和 `UNION ALL`
- 外連線(outer join)示例
- 表連線 join和(+)、union和uion allUI
- 【SQL】13 SQL 別名、SQL 連線(JOIN)、SQL INNER JOIN 關鍵字、SQL LEFT JOIN 關鍵字、SQL RIGHT JOIN 關鍵字、SQL FULL OUTER JSQL
- Mysql實現全外部連線(mysql無法使用full join的解決辦法)MySql
- 關於Oracle full outer join 的bug問題分析及處理Oracle
- mysql求交集:UNION ALL合併查詢,inner join內連線查詢,IN/EXISTS子查詢MySql
- OceanBase 金融專案最佳化案例(union all 改寫)
- oracle知識整理(1) union和union all的區別,left join和right join的區別(各種join的區別)Oracle
- 【SQL】Oracle的內連線、左外連線、右外連線及全外連線SQLOracle
- oracle sql內連線_左(右)連線_全外連線_幾種寫法OracleSQL
- 用實驗方法加深理解Oracle的外連線(left/right/full)和內連線(inner)Oracle
- SQL的四種連線:內連線 左外連線 右外連線 全連線SQL
- Oracle內連線、外連線、右外連線、全外連線小總結Oracle
- join、inner join、left join、right join、outer join的區別
- union all和union的區別
- union和union all的區別
- Union與Union All的區別
- Oracle 內外連線 join 總結Oracle
- Oracle 左外連線、右外連線、全外連線小總結Oracle
- PostgreSQL優化案例之 反連線與外連線等價改寫SQL優化
- 查詢重寫對全外連線無效
- MySql的join(連線)查詢 (三表 left join 寫法)MySql
- not exists改為外連線
- MySQL not in巢狀查詢改寫成外連線方式MySql巢狀
- sql中union和union all的用法SQL
- 【SQL】UNION ALL 與UNION 的區別SQL
- Oracle中的Union、Union All、Intersect、MinusOracle
- sql中union和union allSQL
- 深入理解SQL的四種連線-左外連線、右外連線、內連線、全連線SQL
- 【原】Oracle中Left Outer Join和外關聯(+)的區別Oracle
- Inner Join, Left Outer Join和Association的區別
- 查詢重寫對全外連線無效(二)
- mysql INNER JOIN、LEFT JOIN、RIGHT JOIN;內連線(等值連線)、左連線、右連線MySql
- 例項解析外連線 內連線 自連線 全連線
- sql中UNION和UNION ALL的區別SQL
- 【執行計劃】Oracle 11gR2使用Full outer Joins執行計劃完成全外連線查詢Oracle