oracle外連線符號( )的用法

2021-05-22 18:33:00 字數 3008 閱讀 7181

首先,我們來看一下oralce的《sql reference

》對它的一點說明。

—————————————————————————————————————

注:table a

為主表,

table b

為附表。

—————————————————————————————————————

現在有以下兩張表:

表a 員工(employee)

emp_no

emp_name

jobdept_no11

hxfpresident22

2scott

clerk13

3smith

salesman34

4john

manager

表b 部門(department)

dept_no

dept_name

location

del_***11

accounting

hangzhou02

2research

beijing03

3operations

shanghai

1其中部門表中字段del_***為0表示該條記錄已刪除,是無效記錄;反之相反。

如果需要找出表a中的所有記錄,並關聯上表b中的有效記錄,我們很可能會寫出以下三種sql語句:

語句一:

select

a.emp_name, a.job, b.*

from

employee a, deptment b

where

a.dept_no = b.dept_no(+)

andb.del_***(+) =

'0'

該語句利用oracle的外連線符號,並用條件b.del_***(+) = '0'限定表b種的有效記錄。也有人可能會寫成語句二:

語句二:

select

a.emp_name, a.job, b.*

from

employee a, deptment b

where

a.dept_no = b.dept_no(+)

andb.del_*** =

'0'

語句二中表

b中的字段

del_***

沒帶外連線符號。還有種寫法,如語句三:

語句三:

select

*from

(select

a.emp_name, a.job, b.*

from

employee a, deptment b

where

a.dept_no = b.dept_no(+))

where

del_***

isnull

ordel_*** =

'0'

該語句首先將表a和表

b通過外連線關聯起來,然後對錶

b中的字段

del_***

進行限定,因為要關    聯表

b中的有效字段,所以有條件

del_*** = '0'

,又因為是左連線,所以會有結果集中表

b的記錄為空的情況,所以又加上條件

del_*** is null。

粗粗看起來,以上三種

sql語句的寫法都有道理,沒有問題。那我們再來看下它們的執行結果:

語句一的執行結果

emp_name

jobdept_no

dept_name

location

del_*** 1

scott

clerk 1

accounting

hangzhou 0

2hxf

president 2

research

beijing 0

3john

manager

4smith

salesman

語句二的執行結果

emp_name

jobdept_no

dept_name

location

del_*** 1

hxfpresident 2

research

beijing 0

2scott

clerk 1

accounting

hangzhou 0

語句三的執行結果

emp_name

jobdept_no

dept_name

location

del_*** 1

scott

clerk 1

accounting

hangzhou 0

2hxf

president 2

research

beijing 0

3john

manager

我們發現三條語句的執行結果截然不同。那到底哪乙個是對的呢?

首先我們應該清楚,要求是以表

a為主表,表

b為附表的外連線,根據外連線的定義,就要求選出表

a中的所有記錄,顯然語句二和三的結果就不符號這個要求。其次,我們要求選出表

b中的有效記錄,出現在結果集中的表

b的字段

del_***

的值只能是

0。由此可見,語句一的執行結果是正確的。

那麼語句二和三是怎麼回事呢?在語句二中,雖然對兩張表中的相關字段進行了外連線,但是,對附表

b中的字段

del_***

限定條件的時候,沒有使用外連線符號,導致這個連線變成了全連線。語句三的話,最具有迷惑性,表面看上去很有道理,但實際上它不是真正的外連線,

它把跟附表

b中的無效記錄相關聯的表

a中的記錄也排除在外了,這是不符號外連線要求的。最重要的是,我們要明白對於外連線,有主表和附表之分,主表中的記錄要全部選出,而附表中的記錄可有可無。

oracle外連線符號( )的用法

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

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外連線和「 」號的用法

對於外連線,oracle中可以使用 來表示,9i可以使用left right full outer join,下面將配合例項一一介紹。1.left outer join 左外關聯 select e.last name,e.department id,d.department name from em...