IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁數(shù)據(jù)庫Oracle → Oracle外連接和“+”號(hào)的用法

Oracle外連接和“+”號(hào)的用法

時(shí)間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)

  對(duì)于外連接,Oracle中可以使用"(+)"來表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN,下面將配合實(shí)例一一介紹。

  1. LEFT OUTER JOIN:左外關(guān)聯(lián)

  SELECT e.last_name, e.department_id, d.department_name

  FROM employees e

  LEFT OUTER JOIN departments d

  ON (e.department_id = d.department_id);

  等價(jià)于

  SELECT e.last_name, e.department_id, d.department_name

  FROM employees e, departments d

  WHERE e.department_id=d.department_id(+);

  結(jié)果為:所有員工及對(duì)應(yīng)部門的記錄,包括沒有對(duì)應(yīng)部門編號(hào)department_id的員工記錄。

  2. RIGHT OUTER JOIN:右外關(guān)聯(lián)

  SELECT e.last_name, e.department_id, d.department_name

  FROM employees e

  RIGHT OUTER JOIN departments d

  ON (e.department_id = d.department_id);

  等價(jià)于

  SELECT e.last_name, e.department_id, d.department_name

  FROM employees e, departments d

  WHERE e.department_id(+)=d.department_id;

  結(jié)果為:所有員工及對(duì)應(yīng)部門的記錄,包括沒有任何員工的部門記錄。

  3. FULL OUTER JOIN:全外關(guān)聯(lián)

  SELECT e.last_name, e.department_id, d.department_name

  FROM employees e

  FULL OUTER JOIN departments d

  ON (e.department_id = d.department_id);

  結(jié)果為:所有員工及對(duì)應(yīng)部門的記錄,包括沒有對(duì)應(yīng)部門編號(hào)department_id的員工記錄和沒有任何員工的部門記錄。

  外連接:

  除了顯示匹配相等連接條件的數(shù)據(jù)外,還可以顯示某一個(gè)表中無法匹配相等連接條件的記錄!

  ------------------------------------------------

  1) 左條件(+) = 右條件

  左條件所在的表必須嚴(yán)格進(jìn)行相等連接條件的匹配,而右條件所在的表除了匹配相等連接條件外,還可以顯示無法匹配連接條件的數(shù)據(jù)!

  也稱為右外連接.

  --------------------------------

  可以用下列語句取代:

  SELECT...FROM 表1 RIGHT OUTER JOIN 表2 ON 條件;

  2) 左條件 = 右條件(+)

  右條件所在的表必須嚴(yán)格進(jìn)行相等連接條件的匹配,而左條件所在的表除了匹配相等連接條件外,還可以顯示無法匹配連接條件的數(shù)據(jù)!

  也稱為左外連接.

  --------------------------------

  可以用下列語句取代:

  SELECT...FROM 表1 LEFT OUTER JOIN 表2 ON 條件;

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

  SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO(+) = DEPT.DEPTNO;

  SELECT * FROM EMP RIGHT OUTER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;

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

  SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO(+);

  SELECT * FROM EMP LEFT OUTER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;

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

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

  2)(+)只是在where語句中,并且只能對(duì)應(yīng)一個(gè)表或視圖的一行字段

  3)如果A和B做聯(lián)接時(shí)有多個(gè)條件,那么(+)必須完善所有的匹配條件,

  如果沒有 ,oracle不會(huì)警告你~只是結(jié)果自然不同的

  4)不可以在作出一個(gè)表外查詢 另張表內(nèi)查詢的(+)聯(lián)接操作~~

  5)不可以用(+)外聯(lián)接到自己 當(dāng)然Self Join是可以的

  6)含(+)的Where后的注意

  OR不可用

  IN不可用

  子查詢不可用

  以下給些個(gè)例子:

  SQL code

  SQL> desc part

  Name? Null???? Type

  ----------------------------------------- -------- -----------------

  PART_ID???? NOT NULL VARCHAR2(4)

  SUPPLIER_ID??? VARCHAR2(4)

  SQL> select * from part;

  PART SUPP

  ---- ----

  P1?? S1

  P2?? S2

  P3

  P4

#p#副標(biāo)題#e#

  SQL> desc supplier

  Name? Null???? Type

  ----------------------------------------- -------- -----------------

  SUPPLIER_ID NOT NULL VARCHAR2(4)

  SUPPLIER_NAME???? NOT NULL VARCHAR2(20)

  SQL> select * from supplier;

  SUPP SUPPLIER_NAME

  ---- --------------------

  S1?? Supplier#1

  S2?? Supplier#2

  S3?? Supplier#3

  SQL> select p.part_id, s.supplier_name

  2? from part p, supplier s

  3? where p.supplier_id = s.supplier_id (+);

  PART SUPPLIER_NAME

  ---- --------------------

  P1?? Supplier#1

  P2?? Supplier#2

  P3

  P4

  --(+)是單向的

  SQL> select p.part_id, s.supplier_name

  2? from part p, supplier s

  3? where p.supplier_id (+) = s.supplier_id (+);

  where p.supplier_id (+) = s.supplier_id (+)

  *

  ERROR at line 3:

  ORA-01468: a predicate may reference only one outer-joined table

  --實(shí)現(xiàn)Full Join的方法

  SQL> select p.part_id, s.supplier_name

  2? from part p, supplier s

  3? where p.supplier_id = s.supplier_id (+)

  4? union

  5? select p.part_id, s.supplier_name

  6? from part p, supplier s

  7? where p.supplier_id (+) = s.supplier_id;

  PART SUPPLIER_NAME

  ---- --------------------

  P1?? Supplier#1

  P2?? Supplier#2

  P3

  P4

  Supplier#3

  --現(xiàn)在的語法

  SQL> select p.part_id, s.supplier_name

  2? from part p full outer join supplier s

  3? on p.supplier_id = s.supplier_id;

  PART SUPPLIER_NAME

  ---- --------------------

  P1?? Supplier#1

  P2?? Supplier#2

  P4

  P3

  Supplier#3

  另外的EG:

  SQL code

  SQL> select * from testa;

  ID NAME? ADDR?? AGE

  ---------- ------ ------ ----------

  3 電子?? 南京???? 23

  5 物理?? 北京???? 23

  6 物理?? 河北???? 25

  1 電腦?? 上海???? 23

  2 電子?? 北京???? 22

  4 物理?? 蕪

關(guān)鍵詞標(biāo)簽:Oracle

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實(shí)例的控制文件 誤刪Oracle數(shù)據(jù)庫實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索 為UNIX服務(wù)器設(shè)置Oracle全文檢索

相關(guān)下載

    人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法