【原】Oracle中Left Outer Join和外關聯(+)的區別
外關聯是Oracle資料庫的專有語句
Left Outer Join則是SQL-92的標準語句
通常認為這兩個SQL是可以等效的,但還是有些細微的差別。
一般說來,外關聯的等值條件等效於Left Outer Join中的on語句;兩個where中其他語句是一樣的。
但是Left Outer Join中的其他條件(非表連線)出現在On關鍵詞後面還是出現在Where關鍵詞後面是不一樣的,這樣的語句很難用外關聯進行同義轉義。
下面我們先看一個測試資料,和一個測試案例
建立一個部門表和員工表
CREATE TABLE departments ( depID NUMBER(38,0), depName VARCHAR2(20), delFlag NUMBER(1,0) );
CREATE TABLE employees ( empID NUMBER(38,0), empName VARCHAR2(20), depID NUMBER(38,0), delFlag NUMBER(1,0) );
INSERT INTO departments VALUES(1,'Finacle',0); INSERT INTO departments VALUES(2,'Marketing',0); INSERT INTO departments VALUES(3,'HR',1); INSERT INTO departments VALUES(4,'IT',0);
INSERT INTO employees VALUES(1,'wbq',1,0); INSERT INTO employees VALUES(2,'czh',2,0); INSERT INTO employees VALUES(3,'chh',1,0); INSERT INTO employees VALUES(4,'wal',2,0); INSERT INTO employees VALUES(5,'ddd',3,0);
COMMIT; |
以下為測試例子
--列出部門ID為3的部門和員工資訊,不管該部門是否有員工 SELECT d.depID,d.depName,e.empName FROM departments d LEFT OUTER JOIN employees e ON d.depID = e.depID WHERE d.depID =3 ORDER BY d.depID; --和上面等效 SELECT d.depID,d.depName,e.empName FROM departments d, employees e WHERE d.depID = e.depID(+) AND d.depID =3 ORDER BY d.depID;
--該例子可能不是很恰當,d.depID=3表示首先進行全左連線,然後查詢depID=3的紀錄,如果該部門中找不到對應的員工,則該部門員工則為NULL,同時都顯示部門資訊。 SELECT d.depID,d.depName,e.empName d.delflag FROM departments d LEFT OUTER JOIN employees e ON d.depID = e.depID AND e.depID=3 ORDER BY d.depID; --和上面不等價,差別在於能夠找到無對應員工的部門和有對應員工的部門,卻找不到該部門無員工的部門。 SELECT d.depID,d.depName,e.empName,d.delflag FROM departments d, employees e WHERE d.depID = e.depID(+) AND (e.depID=3 or e.depID is NULL) ORDER BY d.depID; |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6517/viewspace-216974/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Inner Join, Left Outer Join和Association的區別
- join、inner join、left join、right join、outer join的區別
- sql:left join和join區別SQL
- 深入Oracle的left join中on和where的區別詳解Oracle
- oracle left outer join(左聯接)顯示全部的課堂收藏資訊Oracle
- oracle知識整理(1) union和union all的區別,left join和right join的區別(各種join的區別)Oracle
- left join,right join,inner join的條件on和where的區別
- Oracle資料庫聯接(inner join ,outer join)和NOT IN的特殊情況Oracle資料庫
- sql之left join、right join、inner join的區別SQL
- Mysql-left join on後接and,和where的區別MySql
- sql的left join 、right join 、inner join之間的區別SQL
- 【SQL】13 SQL 別名、SQL 連線(JOIN)、SQL INNER JOIN 關鍵字、SQL LEFT JOIN 關鍵字、SQL RIGHT JOIN 關鍵字、SQL FULL OUTER JSQL
- 外連線(outer join)示例
- ZT:簡單介紹join,outer-join,semi-join,anti-join的區別
- sql中的join、left join、right joinSQL
- 三表關聯查詢-多次LEFT JOIN...ON
- Oracle中left join中右表的限制條件Oracle
- LEFT JOIN 和JOIN 多表連線
- left join 後用 on 還是 where,區別大了!
- Oracle中User和Schema的區別和聯絡Oracle
- oracle的left join,right join和full join的一點介紹(R1)Oracle
- oracle update left join查詢Oracle
- Oracle Left join right jionOracle
- 關於Oracle full outer join 的bug問題分析及處理Oracle
- MYSQL 怎麼 LEFT JOIN 多表聯查MySql
- mysql中的left join、right join 、inner join的詳細用法MySql
- sql left join 和 right join解釋SQL
- CROSS APPLY 和outer apply 的區別ROSAPP
- SQL語句中 left join 後用 on 還是 where,區別大SQL
- 用left outer join(sql)實現只顯示重複行最小id的記錄SQL
- sql語句左連結left join--3張表關聯SQL
- Oracle -- left join 什麼情況可以直接改成joinOracle
- mysql + left joinMySql
- 【FULL OUTER JOIN】全外連線的union all改寫方法
- MySQL筆記-左連線的使用(left join有關聯的多表查詢)MySql筆記
- mysql left join轉inner joinMySql
- MySQL LEFT JOIN/ INNER JOIN/RIGHT JOINMySql
- ORACLE中的兩個概念:user和schema的區別和聯絡Oracle