oracle+连接格式,oracle外连接符号(+)的用法
我們都知道,PL/SQL中實(shí)現(xiàn)外連接,除了可以用關(guān)鍵詞OUTER JOIN外,還可以用Oracle的外連接符號(hào)(+)。對(duì)于這個(gè)外連接符號(hào)(+),雖然看到書(shū)上說(shuō):使用(+)進(jìn)行外連接時(shí),where條件中,對(duì)于附表的字段都應(yīng)帶上(+)。但在實(shí)際應(yīng)用中,發(fā)現(xiàn)對(duì)它的理解還遠(yuǎn)遠(yuǎn)不夠。現(xiàn)在結(jié)合實(shí)際的SQL語(yǔ)句,讓我們?cè)僮屑?xì)地瞧瞧這個(gè)(+)的"真面目"吧。
首先,我們來(lái)看一下Oralce的《SQL Reference》對(duì)它的一點(diǎn)說(shuō)明。
—————————————————————————————————————
If the WHERE clause contains a condition that compares a column from table B with a
constant, then the (+) operator must be applied to the column so that Oracle returns
the rows from table A for which it has generated nulls for this column. Otherwise
Oracle returns only the results of a simple join.
注:table A為主表,table B為附表。
—————————————————————————————————————
現(xiàn)在有以下兩張表:
表A?員工(EMPLOYEE)
EMP_NO
EMP_NAME
JOB
DEPT_NO
1
1
HXF
PRESIDENT
2
2
2
SCOTT
CLERK
1
3
3
SMITH
SALESMAN
3
4
4
JOHN
MANAGER
表B?部門(mén)(DEPARTMENT)
DEPT_NO
DEPT_NAME
LOCATION
DEL_FLG
1
1
ACCOUNTING
HANGZHOU
0
2
2
RESEARCH
BEIJING
0
3
3
OPERATIONS
SHANGHAI
1
其中部門(mén)表中字段DEL_FLG為0表示該條記錄已刪除,是無(wú)效記錄;反之相反。
如果需要找出表A中的所有記錄,并關(guān)聯(lián)上表B中的有效記錄,我們很可能會(huì)寫(xiě)出以下三種SQL語(yǔ)句:
語(yǔ)句一:
SELECTA.EMP_NAME, A.JOB, B.*FROMEMPLOYEE A, DEPTMENT BWHEREA.DEPT_NO = B.DEPT_NO(+)ANDB.DEL_FLG(+) ='0'
該語(yǔ)句利用Oracle的外連接符號(hào),并用條件B.DEL_FLG(+) = '0'限定表B種的有效記錄。也有人可能會(huì)寫(xiě)成語(yǔ)句二:
語(yǔ)句二:
SELECTA.EMP_NAME, A.JOB, B.*FROMEMPLOYEE A, DEPTMENT BWHEREA.DEPT_NO = B.DEPT_NO(+)ANDB.DEL_FLG ='0'
語(yǔ)句二中表B中的字段DEL_FlG沒(méi)帶外連接符號(hào)。還有種寫(xiě)法,如語(yǔ)句三:
語(yǔ)句三:
SELECT*FROM(SELECTA.EMP_NAME, A.JOB, B.*FROMEMPLOYEE A, DEPTMENT BWHEREA.DEPT_NO = B.DEPT_NO(+))WHEREDEL_FLGIS?NULL
ORDEL_FLG ='0'
該語(yǔ)句首先將表A和表B通過(guò)外連接關(guān)聯(lián)起來(lái),然后對(duì)表B中的字段DEL_FlG進(jìn)行限定,因?yàn)橐P(guān)??? 聯(lián)表B中的有效字段,所以有條件DEL_FLG = '0',又因?yàn)槭亲筮B接,所以會(huì)有結(jié)果集中表B的記錄為空的情況,所以又加上條件DEL_FLG IS NULL。
粗粗看起來(lái),以上三種SQL語(yǔ)句的寫(xiě)法都有道理,沒(méi)有問(wèn)題。那我們?cè)賮?lái)看下它們的執(zhí)行結(jié)果:
語(yǔ)句一的執(zhí)行結(jié)果
EMP_NAME
JOB
DEPT_NO
DEPT_NAME
LOCATION
DEL_FLG
1
SCOTT
CLERK
1
ACCOUNTING
HANGZHOU
0
2
HXF
PRESIDENT
2
RESEARCH
BEIJING
0
3
JOHN
MANAGER
4
SMITH
SALESMAN
語(yǔ)句二的執(zhí)行結(jié)果
EMP_NAME
JOB
DEPT_NO
DEPT_NAME
LOCATION
DEL_FLG
1
HXF
PRESIDENT
2
RESEARCH
BEIJING
0
2
SCOTT
CLERK
1
ACCOUNTING
HANGZHOU
0
語(yǔ)句三的執(zhí)行結(jié)果
EMP_NAME
JOB
DEPT_NO
DEPT_NAME
LOCATION
DEL_FLG
1
SCOTT
CLERK
1
ACCOUNTING
HANGZHOU
0
2
HXF
PRESIDENT
2
RESEARCH
BEIJING
0
3
JOHN
MANAGER
我們發(fā)現(xiàn)三條語(yǔ)句的執(zhí)行結(jié)果截然不同。那到底哪一個(gè)是對(duì)的呢?
首先我們應(yīng)該清楚,要求是以表A為主表,表B為附表的外連接,根據(jù)外連接的定義,就要求選出表A中的所有記錄,顯然語(yǔ)句二和三的結(jié)果就不符號(hào)這個(gè)要求。其次,我們要求選出表B中的有效記錄,出現(xiàn)在結(jié)果集中的表B的字段DEL_FLG的值只能是0。由此可見(jiàn),語(yǔ)句一的執(zhí)行結(jié)果是正確的。
那么語(yǔ)句二和三是怎么回事呢?在語(yǔ)句二中,雖然對(duì)兩張表中的相關(guān)字段進(jìn)行了外連接,但是,對(duì)附表B中的字段DEL_FLG限定條件的時(shí)候,沒(méi)有使用外連接符號(hào),導(dǎo)致這個(gè)連接變成了全連接。語(yǔ)句三的話(huà),最具有迷惑性,表面看上去很有道理,但實(shí)際上它不是真正的外連接,
它把跟附表B中的無(wú)效記錄相關(guān)聯(lián)的表A中的記錄也排除在外了,這是不符號(hào)外連接要求的。最重要的是,我們要明白對(duì)于外連接,有主表和附表之分,主表中的記錄要全部選出,而附表中的記錄可有可無(wú)。
轉(zhuǎn)自:http://blog.csdn.net/feifei666888/article/details/5653601
總結(jié)
以上是生活随笔為你收集整理的oracle+连接格式,oracle外连接符号(+)的用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 十三省剧情介绍
- 下一篇: c语言 字符串 url,如何对URL字符