關於SQL中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 類似)

 

4.   使用場景:

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

 

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

 

轉自:https://www.cnblogs.com/abeam/p/7137993.html

 


免責聲明!

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



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