首先,我們來看一下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...