Oracle左外連線、右外連線、完全外連線以及(+)號用法
一、準備工作
oracle連線分為:
左外連線:左表不加限制,保留左表的資料,匹配右表,右表沒有匹配到的行中的列顯示為null。
右外連線:右表不加限制,保留右表的資料。匹配左表,左表沒有匹配到的行中列顯示為null。
完全外連線:左右表都不加限制。即右外連線的結果為:左右表匹配的資料+左表沒有匹配到的資料+右表沒有匹配到的資料。
二、連線的語法
left/right/full outer join ...on
left/right/full join ...on
(+)號的作用:+號可以理解為補充的意思,加在那個表的列上就代表這個表的列為補充。加在右表的列上代表右表為補充,為左連線。加在左表的列上代表左表為補充,為右連線。注意:完全外連線中不能使用+號。
三、測試
- 準備測試資料
建立兩種表,插入測試資料:
CREATE TABLE t_A (
id number,
code number,
name VARCHAR2(10)
);
CREATE TABLE t_B (
id number,
code number,
name VARCHAR2(10)
);
INSERT INTO t_A(id,code,name) VALUES(1,2,'A');
INSERT INTO t_A(id,code,name) VALUES(2,1,'B');
INSERT INTO t_A(id,code,name) VALUES(3,5,'C');
INSERT INTO t_A(id,code,name) VALUES(4,6,'D');
INSERT INTO t_A(id,code,name) VALUES(5,7,'E');
INSERT INTO t_B(id,code,name) VALUES(1,3,'AA');
INSERT INTO t_B(id,code,name) VALUES(1,4,'BB');
INSERT INTO t_B(id,code,name) VALUES(2,1,'CC');
INSERT INTO t_B(id,code,name) VALUES(1,2,'DD');
INSERT INTO t_B(id,code,name) VALUES(7,5,'GG');
檢視插入的資料:
select * from t_a;
select * from t_b;
- 左外連線
select * from t_a a left join t_b b on a.id=b.id;
select * from t_a a,t_b b where a.id=b.id(+);
執行結果
- 右外連線
select * from t_a a right join t_b b on a.id=b.id;
select * from t_a a,t_b b where a.id(+)=b.id;
執行結果
- 完全外連線
select * from t_a a full join t_b b on a.id=b.id;
select * from t_a a,t_b b where a.id(+)=b.id(+); --錯誤語法,不支援兩邊(+)
執行結果
- 等值連線
select * from t_a a,t_b b where a.id=b.id;
select * from t_a a join t_b b on a.id=b.id;--等值連線也可以這樣寫
執行結果
- 左外連線(多鍵值)
select * from t_a a left join t_b b on a.id=b.id and a.code=b.code;
select * from t_a a,t_b b where a.id=b.id(+) and a.code=b.code(+);
執行結果
- 右外連線(多鍵值)
select * from t_a a right join t_b b on a.id=b.id and a.code=b.code;
select * from t_a a,t_b b where a.id(+)=b.id and a.code(+)=b.code;
執行結果
- 完全外連線(多鍵值)
select * from t_a a full join t_b b on a.id=b.id and a.code=b.code;
執行結果
- 等值連線(多鍵值)
select * from t_a a,t_b b where a.id=b.id and a.code=b.code;
select * from t_a a join t_b b on a.id=b.id and a.code=b.code;--等值連線也可以這樣寫
執行結果
- 左外連線(多鍵值or)
select * from t_a a left join t_b b on a.id=b.id or a.code=b.code;
select * from t_a a,t_b b where a.id=b.id(+) or a.code=b.code(+); --錯誤:ORA-01719: OR 或 IN 運算元中不允許外部聯接運算子 (+)
執行結果
- 右外連線(多鍵值or)
select * from t_a a right join t_b b on a.id=b.id or a.code=b.code;
select * from t_a a,t_b b where a.id(+)=b.id or a.code(+)=b.code; --錯誤:ORA-01719: OR 或 IN 運算元中不允許外部聯接運算子 (+)
執行結果
- 完全外連線(多鍵值or)
select * from t_a a full join t_b b on a.id=b.id or a.code=b.code;
執行結果
- 等值連線(多鍵值or)
select * from t_a a,t_b b where a.id=b.id or a.code=b.code;
select * from t_a a join t_b b on a.id=b.id or a.code=b.code;--等值連線也可以這樣寫
執行結果
- 試試
select * from t_a a,t_b b where a.id=b.id(+) and a.code(+)=b.code;
// 錯誤:ORA-01416: 兩表無法彼此外部連線
select * from t_a a left join t_b b on a.id=b.id where a.code(+)=b.code;
select * from t_a a, t_b c left join t_b b on a.id=b.id where a.code(+)=c.code;
// ORA-25156: 舊樣式的外部聯接 (+) 不能與 ANSI 聯接一起使用
select * from t_a a
left join t_b b on a.id=b.id
left join t_b c on a.id=c.id;
select * from t_a a,t_b b,t_b c
where a.id=b.id(+) and a.id=c.id(+);
select * from t_a a
left join t_b b on a.id=b.id
left join t_b c on a.id=c.id and b.id=c.id;
select * from t_a a,t_b b,t_b c
where a.id=b.id(+) and a.id=c.id(+) and b.id=c.id(+);
select * from t_a a,t_b b,t_b c
where a.id=b.id(+) and a.id=c.id(+) and b.id=c.id;
select * from t_a a
left join t_b b on a.id=b.id
left join t_b c on a.id=c.id and b.code=c.code;
select * from t_a a,t_b b,t_b c
where a.id=b.id(+) and a.id=c.id(+) and b.code=c.code(+);
select * from t_a a,t_b b,t_b c
where b.code=c.code(+) and a.id=b.id(+) and a.id=c.id(+) ;
select * from t_a a,t_b b,t_b c
where a.id=b.id(+) and a.id=c.id(+) or a.code=c.code ;
select * from t_a a,t_b b,t_b c
where (a.id=b.id(+) and a.id=c.id(+)) or a.code=c.code ;
select * from t_a a,t_b b,t_b c
where a.id=b.id(+) and (a.id=c.id(+) or a.code=c.code) ;
多個連線條件的注意事項
Oracle中,兩個表通過多個關連條件外連線的時候,如果多個條件中有沒有寫(+)的條件,則連線會自動變成內連線,而不再是外連線。這種情況應該是屬於寫SQL的失誤。遇到這種情況的時候一定要注意。
相關文章
- Oracle 左外連線、右外連線、全外連線小總結Oracle
- 【SQL】Oracle的內連線、左外連線、右外連線及全外連線SQLOracle
- SQL的四種連線:內連線 左外連線 右外連線 全連線SQL
- Oracle內連線、外連線、右外連線、全外連線小總結Oracle
- 深入理解SQL的四種連線-左外連線、右外連線、內連線、全連線SQL
- MYSQL語法:左連線、右連線、內連線、全外連線MySql
- oracle sql內連線_左(右)連線_全外連線_幾種寫法OracleSQL
- sql和hql中join語句區別,以及hibernate中內連線,迫切內連線,左外連線,迫切左外連線,右外連線的區別(合集)...SQL
- 內聯,左外聯,右外聯,全連線,交叉連線 的區別
- mysql左外連線MySql
- Oracle左連線,右連線Oracle
- InfoSet中左外連線
- 左連線,右連線
- oracle外連線Oracle
- 內連線、左連線、右連線
- 內連線、外連線
- Oracle的左連線和右連線Oracle
- 左連線與右連線
- 左連線和右連線
- sql 內連線和外連線SQL
- 外連線與連線順序
- 內連線、外連線總結
- SQL SERVER 自連線、外連線SQLServer
- Oracle 表連線方式詳解(外連結、內連線、自連線)Oracle
- oracle 外連線的使用Oracle
- 例項解析外連線 內連線 自連線 全連線
- pl/sql裡的左連線和右連線符號“+”SQL符號
- MySQL筆記3——內連線/外連線、多表連線MySql筆記
- SQL中的左連線和右連線SQL
- mysql 左連線,右連線,內連結,exists等MySql
- sql內連結,外連線SQL
- sybase的外連線
- mysql INNER JOIN、LEFT JOIN、RIGHT JOIN;內連線(等值連線)、左連線、右連線MySql
- Oracle 內外連線 join 總結Oracle
- iOS wifi連線外設iOSWiFi
- mysql 外連線總結MySql
- 多表外連線的使用
- not in 用外連線實現