日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

oracle+连接格式,oracle外连接符号(+)的用法

發(fā)布時(shí)間:2023/11/30 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle+连接格式,oracle外连接符号(+)的用法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我們都知道,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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。