使用 CROSS APPLY 與 OUTER APPLY 連接查詢


Ø  前言

日常開發中遇到多表查詢時,首先會想到 INNER JOIN LEFT OUTER JOIN 等等,但是這兩種查詢有時候不能滿足需求。比如,左表一條關聯右表多條記錄時,我需要控制右表的某一條多條記錄跟左表匹配。貌似,INNER JOIN LEFT OUTER JOIN 不能很好完成。但是 CROSS APPLY OUTER APPLY 可以,下面用示例說明。

 

1.   示例一

Ø  有兩張表:Student(學生表)和 Score(成績表),數據如下:

clip_image002[10]

 

1)   查詢每個學生最近兩次的考試成績

1.   先試下 INNER JOIN

1)   SQL 代碼

SELECT T1.StudentNo, T1.Name, T2.ExamScore, T2.ExamDate FROM Student AS T1

INNER JOIN Score AS T2 ON T1.StudentNo = T2.StudentNo

2)   結果:

clip_image003[12]

3)   咦,不對,這不是我想要的結果。

 

2.   再看看 CROSS APPLY

1)   SQL 代碼

SELECT T1.StudentNo, T1.Name, T2.ExamScore, T2.ExamDate FROM Student AS T1

CROSS APPLY(

    SELECT TOP 2 * FROM Score AS T

    WHERE T1.StudentNo = T.StudentNo

    ORDER BY T.ExamDate DESC

) AS T2

2)   結果:

clip_image004[12]

3)   嗯,這次對了,並且還是按照考試時間倒序排序的。

 

2)   查詢每個學生最近兩次的考試成績,沒有參加考試的同學成績補 null

1.   先試下 LEFT OUTER JOIN

1)   SQL 代碼

SELECT T1.StudentNo, T1.Name, T2.ExamScore, T2.ExamDate FROM Student AS T1

LEFT OUTERJOIN Score AS T2 ON T1.StudentNo = T2.StudentNo

2)   結果:

clip_image005[12]

3)   咦,不對,這又不是我想要的結果。

 

2.   再看看 OUTER APPLY

1)   SQL 代碼

SELECT T1.StudentNo, T1.Name, T2.ExamScore, T2.ExamDate FROM Student AS T1

OUTER APPLY(

    SELECT TOP 2 * FROM Score AS T

    WHERE T1.StudentNo = T.StudentNo

    ORDER BY T.ExamDate DESC

) AS T2

2)   結果:

clip_image006[10]

3)   嗯,這次對了,不但按照考試時間倒序排序的,而且沒有考試的同學也被查出來了。

 

Ø  總結

1.   理解 CROSS APPLY OUTER APPLY(個人理解)

1)   CROSS APPLY 的意思是交叉應用,在查詢時首先查詢左表,然后右表的每一條記錄跟左表的當前記錄進行匹配。匹配成功則將左表與右表的記錄合並為一條記錄輸出;匹配失敗則拋棄左表與右表的記錄。(與 INNER JOIN 類似)

2)   OUTER APPLY 的意思是外部應用,與 CROSS APPLY 的原理一致,只是在匹配失敗時,左表與右表也將合並為一條記錄輸出,不過右表的輸出字段為 null。(與 LEFT OUTER JOIN 類似)

 

2.   CROSS APPLY INNER JOIN 的區別

1)   CROSS APPLY 可以根據當前左表的當前記錄去查詢右表,但是 INNER JOIN 不可以,INNER JOIN 是根據左表的當前記錄匹配右表整個結果集。

2)   兩者都是匹配成功才輸出。

 

3.   OUTER APPLY LEFT OUTER JOIN 的區別

1)   它們和(CROSS APPLY INNER JOIN)類似。

2)   只是兩者都是匹配失敗也會輸出。

 

4.   使用場景:

1)   一個商品有多張圖片,但是只想取最近的一張圖片跟商品匹配。

 

5.   總結一句話:右表可以是有條件的跟左表的記錄匹配,而條件的值可以來至於左表。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM