iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 14
0
Data Technology

SQL Server 學習日誌系列 第 14

14. CROSS APPLY 與 OUTER APPLY

前言

本篇文章圖片毀損,請參考: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


上一篇
13. Database Mail 設定
下一篇
15.WITH common table expression 一般資料表運算式
系列文
SQL Server 學習日誌30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
打字工
iT邦新手 5 級 ‧ 2018-01-12 14:55:00

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

謝謝提醒,我太不嚴謹了 :)

我要留言

立即登入留言