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的失誤。遇到這種情況的時候一定要注意。
相關文章
- MYSQL語法:左連線、右連線、內連線、全外連線MySql
- 內聯,左外聯,右外聯,全連線,交叉連線 的區別
- 內連線、左連線、右連線
- sql 內連線和外連線SQL
- MySQL筆記3——內連線/外連線、多表連線MySql筆記
- mysql INNER JOIN、LEFT JOIN、RIGHT JOIN;內連線(等值連線)、左連線、右連線MySql
- 3.DQL資料查詢語言(內連線,外連線,自連線)
- Mysql——內外連線,事物,索引MySql索引
- MYSQL學習筆記23: 多表查詢(自連線內連線+左右外連線)MySql筆記
- python連線Oracle的外掛cx_Oracle安裝PythonOracle
- MySQL連線控制外掛介紹MySql
- mysql外連線有哪些型別MySql型別
- PostgreSQL優化案例之 反連線與外連線等價改寫SQL優化
- 關於外連線和where條件
- 無法連線java visualvm外掛中心JavaLVM
- Vmware虛擬機器連線外網虛擬機
- 內外網同時連線解決
- 通過外來鍵連線多個表
- Winodws同時連線內網和外網內網
- 連線位置國外的遠端桌面,使用anydesk
- SQL改寫系列九:外連線轉內連線的常見場景與錯誤SQL
- Servlet連線OracleServletOracle
- PHP 連線 OraclePHPOracle
- thinkphp連線OraclePHPOracle
- PHP 連線oraclePHPOracle
- SQL改寫系列九:外連線轉內連線的常見場景與錯誤-2SQL
- java操作Oracle 方式一 ( 連線-》操作-》斷開連線 )JavaOracle
- 【JDBC】java連線池模擬測試 連線oracleJDBCJavaOracle
- 【JDBC】使用OracleDataSource建立連線池用於連線OracleJDBCOracle
- 機械行業ERP系統生產委外管理:內外無縫連線行業
- cx_Oracle 連線 OracleOracle
- oracle 連線查詢Oracle
- DBA ORACLE連線操作Oracle
- 3.2.2 python連線oraclePythonOracle
- IDEA安裝外掛【Database navigation】並連線資料庫IdeaDatabaseNavigation資料庫
- GODADLY:雲伺服器如何設定禁止外網連線Go伺服器
- 外連線有 OR 關聯條件只能走 NL優化優化
- Vscode外掛:將程式碼連線到IDE中的文件VSCodeIDE