1. 程式人生 > 其它 >關於SQL中OUTER APPLY和 CROSS APPLY的用法

關於SQL中OUTER APPLY和 CROSS APPLY的用法

前言

日常開發中遇到多表查詢時,首先會想到 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)   咦,不對,這不是我想要的結果。

  1. 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)   咦,不對,這又不是我想要的結果。

  1. 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 類似)

  1. 使用場景:

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

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

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