Oracle外連線和「 」號的用法

2021-08-30 22:51:07 字數 4946 閱讀 4869

對於外連線,oracle中可以使用「(+)」來表示,9i可以使用left/right/full outer join,下面將配合例項一一介紹。

1. left outer join:左外關聯

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);

等價於select e.last_name, e.department_id, d.department_name

from employees e, departments d

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

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

2. right outer join:右外關聯

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);

等價於select e.last_name, e.department_id, d.department_name

from employees e, departments d

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

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

3. full outer join:全外關聯

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);

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

外連線:

除了顯示匹配相等連線條件的資料外,還可以顯示某乙個表中無法匹配相等連線條件的記錄!

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

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

也稱為右外連線.

可以用下列語句取代:

select...from 表1 right outer join 表2 on 條件;

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

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

也稱為左外連線.

可以用下列語句取代:

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操作符(+).而且(+)是要受下面的規則限制的,但outer join語法則不受的~~

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

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

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

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

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

5)不可以用(+)外聯接到自己 當然self join是可以的

6)含(+)的where後的注意

or不可用

in不可用

子查詢不可用

以下給些個例子:

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

p3p4

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

p3p4

--(+)是單向的

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

--實現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

p3p4

supplier#3

--現在的語法

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

p4p3

supplier#3

另外的eg:

sql code

sql> select * from testa;

id name  addr         age

3 電子   南京           23

5 物理   北京           23

6 物理   河北           25

1 電腦   上海           23

2 電子   北京           22

4 物理   蕪湖           22

7 藝術   上海           21

8 歌劇   蘇州           16

9 沈亮   上海           22

已選擇9行。

sql> select * from testb;

id addr

7 上海

1 北京

3 上海

5 合肥

--匹配完全

select testa.id,testa.addr from testa,testb where testa.id(+)=testb.id and

testa.addr(+)=testb.addr;

id addr

7 上海

現在的outer join方法是oracle9i時開始引用的 ansi標準的聯接語法,現在的則比較直觀 簡單

通過上邊full join的實現方式 不難看到ansi的聯接語法要比用含union的(+)的執行效率更高~~

Oracle 外連線和 號的用法

表 pandaa pandab id name id job parent id 1 panda 1 吃 11 2 kongfu 2 喝 12 3 nuddle 4 睡 13 左外鏈結 左邊表不限制 右邊表等值連線 左面表所有資料那過來,右面表按id等值鏈結,沒值的顯示空值 select from ...

oracle外連線符號( )的用法

首先,我們來看一下oralce的 sql reference 對它的一點說明。注 table a 為主表,table b 為附表。現在有以下兩張表 表a 員工 employee emp no emp name jobdept no11 hxfpresident22 2scott clerk13 3s...

oracle外連線符號( )的用法

首先,我們來看一下oralce的 sql reference 對它的一點說明。注 table a 為主表,table b 為附表。現在有以下兩張表 表a 員工 employee emp no emp name jobdept no11 hxfpresident22 2scott clerk13 3s...