熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle外連接和“+”號的用法

2022-06-13   來源: Oracle 

  對於外連接Oracle中可以使用(+)來表示i可以使用LEFT/RIGHT/FULL OUTER JOIN下面將配合實例一一介紹

   LEFT OUTER JOIN左外關聯

  SELECT elast_name edepartment_id ddepartment_name

  FROM employees e

  LEFT OUTER JOIN departments d

  ON (edepartment_id = ddepartment_id);

  等價於

  SELECT elast_name edepartment_id ddepartment_name

  FROM employees e departments d

  WHERE edepartment_id=ddepartment_id(+);

  結果為所有員工及對應部門的記錄包括沒有對應部門編號department_id的員工記錄

   RIGHT OUTER JOIN右外關聯

  SELECT elast_name edepartment_id ddepartment_name

  FROM employees e

  RIGHT OUTER JOIN departments d

  ON (edepartment_id = ddepartment_id);

  等價於

  SELECT elast_name edepartment_id ddepartment_name

  FROM employees e departments d

  WHERE edepartment_id(+)=ddepartment_id;

  結果為所有員工及對應部門的記錄包括沒有任何員工的部門記錄

   FULL OUTER JOIN全外關聯

  SELECT elast_name edepartment_id ddepartment_name

  FROM employees e

  FULL OUTER JOIN departments d

  ON (edepartment_id = ddepartment_id);

  結果為所有員工及對應部門的記錄包括沒有對應部門編號department_id的員工記錄和沒有任何員工的部門記錄

  外連接:

  除了顯示匹配相等連接條件的數據外還可以顯示某一個表中無法匹配相等連接條件的記錄!

  

  ) 左條件(+) = 右條件

  左條件所在的表必須嚴格進行相等連接條件的匹配而右條件所在的表除了匹配相等連接條件外還可以顯示無法匹配連接條件的數據!

  也稱為右外連接

  

  可以用下列語句取代:

  SELECTFROM 表 RIGHT OUTER JOIN 表 ON 條件;

  ) 左條件 = 右條件(+)

  右條件所在的表必須嚴格進行相等連接條件的匹配而左條件所在的表除了匹配相等連接條件外還可以顯示無法匹配連接條件的數據!

  也稱為左外連接

  

  可以用下列語句取代:

  SELECTFROM 表 LEFT OUTER JOIN 表 ON 條件;

  REM 除了相等連接之外顯示沒有員工的部門信息

  SELECT * FROM EMPDEPT WHERE EMPDEPTNO(+) = DEPTDEPTNO;

  SELECT * FROM EMP RIGHT OUTER JOIN DEPT ON EMPDEPTNO = DEPTDEPTNO;

  REM 除了相等連接之外顯示沒有部門的員工信息

  SELECT * FROM EMPDEPT WHERE EMPDEPTNO = DEPTDEPTNO(+);

  SELECT * FROM EMP LEFT OUTER JOIN DEPT ON EMPDEPTNO = DEPTDEPTNO;

  Oracle 建議你用在From語句後用Outer Join語法 而不是Oracle的Join操作符(+)而且(+)是要受下面的規則限制的但Outer Join語法則不受的~~

  )你不可以在查詢塊中使用(+) 當它同時包含 join的from語句中

  )(+)只是在where語句中並且只能對應一個表或視圖的一行字段

  )如果A和B做聯接時有多個條件那麼(+)必須完善所有的匹配條件

  如果沒有 oracle不會警告你~只是結果自然不同的

  )不可以在作出一個表外查詢 另張表內查詢的(+)聯接操作~~

  )不可以用(+)外聯接到自己 當然Self Join是可以的

  )含(+)的Where後的注意

  OR不可用

  IN不可用

  子查詢不可用

  以下給些個例子

  SQL code

  SQL> desc part

  Name                                      Null?    Type

  

  PART_ID                                   NOT NULL VARCHAR()

  SUPPLIER_ID                                        VARCHAR()

  SQL> select * from part;

  PART SUPP

  

  P   S

  P   S

  P

  P

  SQL> desc supplier

  Name                                      Null?    Type

  

  SUPPLIER_ID                               NOT NULL VARCHAR()

  SUPPLIER_NAME                             NOT NULL VARCHAR()

  SQL> select * from supplier;

  SUPP SUPPLIER_NAME

  

  S   Supplier#

  S   Supplier#

  S   Supplier#

  SQL> select ppart_id ssupplier_name

    from part p supplier s

    where psupplier_id = ssupplier_id (+);

  PART SUPPLIER_NAME

  

  P   Supplier#

  P   Supplier#

  P

  P

  (+)是單向的

  SQL> select ppart_id ssupplier_name

    from part p supplier s

    where psupplier_id (+) = ssupplier_id (+);

  where psupplier_id (+) = ssupplier_id (+)

  *

  ERROR at line :

  ORA: a predicate may reference only one outerjoined table

  實現Full Join的方法

  SQL> select ppart_id ssupplier_name

    from part p supplier s

    where psupplier_id = ssupplier_id (+)

    union

    select ppart_id ssupplier_name

    from part p supplier s

    where psupplier_id (+) = ssupplier_id;

  PART SUPPLIER_NAME

  

  P   Supplier#

  P   Supplier#

  P

  P

  Supplier#

  現在的語法

  SQL> select ppart_id ssupplier_name

    from part p full outer join supplier s

    on psupplier_id = ssupplier_id;

  PART SUPPLIER_NAME

  

  P   Supplier#

  P   Supplier#

  P

  P

  Supplier#

  另外的EG

  SQL code

  SQL> select * from testa;

  ID NAME  ADDR         AGE

  

   電子   南京          

   物理   北京          

   物理   河北          

   電腦   上海          

   電子   北京          

   物理   蕪湖          

   藝術   上海          

   歌劇   蘇州          

   沈亮   上海          

  已選擇

  SQL> select * from testb;

  ID ADDR

  

   上海

   北京

   上海

   合肥

  匹配完全

  select testaidtestaaddr from testatestb where testaid(+)=testbid and

  testaaddr(+)=testbaddr;

  ID ADDR

  

   上海

  現在的Outer Join方法是Oraclei時開始引用的 ANSI標准的聯接語法現在的則比較直觀 簡單

  通過上邊Full Join的實現方式 不難看到ANSI的聯接語法要比用含Union的(+)的執行效率更高~~


From:http://tw.wingwit.com/Article/program/Oracle/201311/17460.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.