本篇文章圖片毀損,請參考:https://dog0416.blogspot.com/2020/10/sql-server-cross-apply-outer-apply.html
第一次看到 cross apply 與 outer apply 的時候是在 code review 的時候,充滿陌生感,查了一些資料隱約猜到其行為。第二次因為偵錯修改程式時又遇到相同的語法,但自己卻忘了一乾二淨,又得重新查資料。故趁這次鐵人賽好好學習這兩個語法。
APPLY 主要用於將某一個子查詢合一個資料表函式做 JOIN 運算,有別於 JOIN 運算,APPLY 不使用 ON 選擇關聯欄位,則是將欄位帶入方式使用。子查詢結果會被當作為 left ,而資料表函式當作 right 進行運算。
SELECT A.column1, ... ,B.column1, ...
FROM TableA AS A
CROSS APPLY TableFunction (A.Id) AS TF
CROSS APPLY 和 OUTER APPLY 是從 SQL Server 2005 新增的語法,其使用時資料庫相容層級要90。這兩個語法效果等同於 INNER JOIN 與 LEFT OUTER JOIN。
這邊舉一個例子來看看 (範例有一點差,但我們直接看效果)
Employee 資料表內容如下
Id | Name | CountryName |
---|---|---|
1 | Duran | Kaohsiung |
2 | Owen | Taipei |
3 | Maze | Taichung |
4 | Bert | Taipei |
Dept 資料表內容如下:
Id | Name | CountryName |
---|---|---|
1 | PM | Taipei |
2 | DEV | Taichung |
3 | DESIGN | Tapei |
4 | DEV | Taipei |
5 | SUPPORT | Taichung |
6 | SUPPORT | Tainan |
7 | IT | Kaohsiung |
首先我們先建立資料表函式
CREATE FUNCTION GetDept(@CountryName varchar(25))
RETURNS TABLE
RETURN
(
SELECT Id, Name, CountryName
FROM Dept
WHERE CountryName = @CountryName
)
我們使用 CROSS APPLY
SELECT E.Id, E.Name, E.CountryName, TD.Name, E.CountryName
FROM EMPLOYEE AS E
CROSS APPLY GetDept(E.CountryName) TD
接下來我們使用 OUTER APPLY
SELECT E.Id, E.Name, E.CountryName, TD.Name, E.CountryName
FROM EMPLOYEE AS E
OUTER APPLY GetDept(E.CountryName) TD
使用 APPLY - https://technet.microsoft.com/zh-tw/library/ms175156(v=sql.105).aspx
Employee和Dept的Country 應該是 CountryName
CROSS APPLY
就等於
SELECT E.Id, E.Name, E.CountryName, TD.Name, E.CountryName
FROM EMPLOYEE AS E
JOIN Dept TD
ON E.CountryName = TD.CountryName
**OUTER APPLY **
就等於
SELECT E.Id, E.Name, E.CountryName, TD.Name, E.CountryName
FROM EMPLOYEE AS E
LEFT OUTER JOIN Dept TD
ON E.CountryName = TD.CountryName
謝謝提醒,我太不嚴謹了 :)