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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

我們都知道,PL/SQL中實現外連接,除了可以用關鍵詞OUTER JOIN外,還可以用Oracle的外連接符號(+)。對于這個外連接符號(+),雖然看到書上說:使用(+)進行外連接時,where條件中,對于附表的字段都應帶上(+)。但在實際應用中,發現對它的理解還遠遠不夠。現在結合實際的SQL語句,讓我們再仔細地瞧瞧這個(+)的"真面目"吧。

首先,我們來看一下Oralce的《SQL Reference》對它的一點說明。

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

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為附表。

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

現在有以下兩張表:

表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?部門(DEPARTMENT)

DEPT_NO

DEPT_NAME

LOCATION

DEL_FLG

1

1

ACCOUNTING

HANGZHOU

0

2

2

RESEARCH

BEIJING

0

3

3

OPERATIONS

SHANGHAI

1

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

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

語句一:

SELECTA.EMP_NAME, A.JOB, B.*FROMEMPLOYEE A, DEPTMENT BWHEREA.DEPT_NO = B.DEPT_NO(+)ANDB.DEL_FLG(+) ='0'

該語句利用Oracle的外連接符號,并用條件B.DEL_FLG(+) = '0'限定表B種的有效記錄。也有人可能會寫成語句二:

語句二:

SELECTA.EMP_NAME, A.JOB, B.*FROMEMPLOYEE A, DEPTMENT BWHEREA.DEPT_NO = B.DEPT_NO(+)ANDB.DEL_FLG ='0'

語句二中表B中的字段DEL_FlG沒帶外連接符號。還有種寫法,如語句三:

語句三:

SELECT*FROM(SELECTA.EMP_NAME, A.JOB, B.*FROMEMPLOYEE A, DEPTMENT BWHEREA.DEPT_NO = B.DEPT_NO(+))WHEREDEL_FLGIS?NULL

ORDEL_FLG ='0'

該語句首先將表A和表B通過外連接關聯起來,然后對表B中的字段DEL_FlG進行限定,因為要關??? 聯表B中的有效字段,所以有條件DEL_FLG = '0',又因為是左連接,所以會有結果集中表B的記錄為空的情況,所以又加上條件DEL_FLG IS NULL。

粗粗看起來,以上三種SQL語句的寫法都有道理,沒有問題。那我們再來看下它們的執行結果:

語句一的執行結果

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

語句二的執行結果

EMP_NAME

JOB

DEPT_NO

DEPT_NAME

LOCATION

DEL_FLG

1

HXF

PRESIDENT

2

RESEARCH

BEIJING

0

2

SCOTT

CLERK

1

ACCOUNTING

HANGZHOU

0

語句三的執行結果

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

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

首先我們應該清楚,要求是以表A為主表,表B為附表的外連接,根據外連接的定義,就要求選出表A中的所有記錄,顯然語句二和三的結果就不符號這個要求。其次,我們要求選出表B中的有效記錄,出現在結果集中的表B的字段DEL_FLG的值只能是0。由此可見,語句一的執行結果是正確的。

那么語句二和三是怎么回事呢?在語句二中,雖然對兩張表中的相關字段進行了外連接,但是,對附表B中的字段DEL_FLG限定條件的時候,沒有使用外連接符號,導致這個連接變成了全連接。語句三的話,最具有迷惑性,表面看上去很有道理,但實際上它不是真正的外連接,

它把跟附表B中的無效記錄相關聯的表A中的記錄也排除在外了,這是不符號外連接要求的。最重要的是,我們要明白對于外連接,有主表和附表之分,主表中的記錄要全部選出,而附表中的記錄可有可無。

轉自:http://blog.csdn.net/feifei666888/article/details/5653601

總結

以上是生活随笔為你收集整理的oracle+连接格式,oracle外连接符号(+)的用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。