Ø 前言
日常開發中遇到多表查詢時,首先會想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是這兩種查詢有時候不能滿足需求。
比如,左表一條關聯右表多條記錄時,我需要控制右表的某一條或多條記錄跟左表匹配。貌似,INNER JOIN 或 LEFT OUTER JOIN 不能很好完成。
但是 CROSS APPLY 與 OUTER APPLY 可以,下面用示例說明。
1. 示例一
Ø 有兩張表:Student(學生表)和 Score(成績表),數據如下:
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) 結果:
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) 結果:
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) 結果:
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) 結果:
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