SQL Server使用CROSS APPLY與OUTER APPLY實現連接查詢
概述
CROSS APPLY 與 OUTER APPLY 可以做到:
左表一條關聯右表多條記錄時,我需要控制右表的某一條或多條記錄跟左表匹配的情況。
有兩張表:Student(學生表)和 Score(成績表),數據如下:
一、CROSS APPLY
ROSS APPLY 的意思是“交叉應用”,在查詢時首先查詢左表,,然后右表的每一條記錄跟左表的當前記錄進行匹配。匹配成功則將左表與右表的記錄合并為一條記錄輸出;匹配失敗則拋棄左表與右表的記錄。(與 INNER JOIN 類似)
查詢每個學生最近兩次的考試成績。
SELECT T1.StudentNo, T1.Name, T2.ExamScore, T2.ExamDate FROM Student AS T1CROSS APPLY( SELECT TOP 2 * FROM Score AS T WHERE T1.StudentNo = T.StudentNo ORDER BY T.ExamDate DESC) AS T2
結果:
二、OUTER APPLY
OUTER APPLY 的意思是“外部應用”,與 CROSS APPLY 的原理一致,只是在匹配失敗時,左表與右表也將合并為一條記錄輸出,不過右表的輸出字段為null。(與 LEFT OUTER JOIN 類似)
查詢每個學生最近兩次的考試成績,沒有參加考試的同學成績補 null
SELECT T1.StudentNo, T1.Name, T2.ExamScore, T2.ExamDate FROM Student AS T1OUTER APPLY( SELECT TOP 2 * FROM Score AS T WHERE T1.StudentNo = T.StudentNo ORDER BY T.ExamDate DESC) AS T2
結果:
三、應用場景
1.結合表值函數使用:
有一張表是這樣的:
很簡單的一張表,就一個字段num,我想把這個字段的int型數字分別轉化成二進制八進制和十六進制的數值,有現成的進制轉化的表值函數。
SELECT * FROM #T a CROSS APPLY [dbo].[F_TConversion](a.num)
總結一下:如果查詢結果集需要用到表值函數對某個字段的值進行處理的話,請使用CROSS APPLY~
2.top子查詢的用法:
有一張學生表,分別name,學科,分數 這三個字段,如下:
我要看語文第一名,數學前兩名,英語前三名的name,學科,分數,用cross apply實現方法如下:
SELECT b.* FROM ( select Subject="Chiness",num=1 union all select "Math",2 union all select "English",3) a cross apply (select top(a.num) * from Students where Subject=a.Subject ) b
到此這篇關于SQL Server使用CROSS APPLY與OUTER APPLY實現連接查詢的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持。
相關文章:
1. 從舊版本SQL Server中重新存儲數據2. Sql Server全文搜索中文出錯的問題3. Sql Server中通過sql命令獲取cpu占用及產生鎖的sql4. SQL Server數據庫超級管理員賬號防護知識5. SQL Server 2005 Reporting Services的一個bug及其解決方法6. sql server 2000 游標用法小例7. SQL Server數據庫判斷最近一次的備份執行結果(最新推薦)8. SQL Server 2008如何開啟遠程連接9. SQL Server 2005密碼安全追蹤與存儲10. 無法在 SQL Server 2005 Manger Studio 中錄入中文的問題