【原】Oracle中Left Outer Join和外關聯(+)的區別

bq_wang發表於2008-03-23

 

外關聯是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;

 

以下為測試例子

--列出部門ID3的部門和員工資訊,不管該部門是否有員工

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章