Navicat 部落格

理解 SQL Server 的 CROSS APPLY 和 OUTER APPLY 査詢 - 第 1 部分 2021 年 9 月 27 日,由 Robert Gravelle 撰寫

第 1 部份:APPLY 與 JOIN

你可能知道,SQL Server 中的 JOIN 作業用於聯結兩個或多個資料表。但是,在 SQL Server 中,不能使用 JOIN 作業將資料表與資料表值函式的輸出聯結起來。如果你沒有聽說過資料表值函數,這些函式是以資料表的形式傳回資料。為了聯結兩個資料表運算式,SQL Server 2005 引入了 APPLY 運算子。在這篇文章中,我們將學習 APPLY 運算子與一般 JOIN 有何不同。

關於 CROSS APPLY 和 OUTER APPLY

SQL Server 的 APPLY 運算子有兩種變體:CROSS APPLY 和 OUTER APPLY:

  • CROSS APPLY 運算子僅傳回左邊資料表運算式(在其最終輸出中)中與右邊資料表運算式符合的列。
    因此,CROSS APPLY 類似於 INNER JOIN,或者更準確地說,類似於具有隱含聯結條件 1=1 的相關子査詢的 CROSS JOIN。
  • OUTER APPLY 運算子傳回左邊資料表運算式中的所有列,無論其與右邊資料表運算式是否符合。對於右邊資料表運算式中沒有對應符合項目的列,它在右邊資料表運算式的欄中傳回 NULL 值。
    因此,OUTER APPLY 相當於 LEFT OUTER JOIN。

雖然可以使用普通 JOIN 編寫相同的査詢,但當右邊有一個資料表值運算式,並且希望對左邊資料表值運算式中的每一列計算該資料表值運算式時,就需要使用 APPLY。此外,在某些情况下,使用 APPLY 運算子可以提高査詢效能。

讓我們通過一些範例進一步探討 APPLY 運算子。

樣本資料

我們將在 Navicat for SQL Server 中執行査詢建立的兩個新資料表。以下是 Department 資料表的設計:

Department_table_design (47K)

以下是 Employee 資料表的設計:

Employee_table_design (51K)

在 Navicat 査詢編輯器中執行以下 SQL 將資料填入資料表:

INSERT [Department] ([DepartmentID], [Name])  
VALUES (1, N'Engineering') 
INSERT [Department] ([DepartmentID], [Name])  
VALUES (2, N'Administration') 
INSERT [Department] ([DepartmentID], [Name])  
VALUES (3, N'Sales') 
INSERT [Department] ([DepartmentID], [Name])  
VALUES (4, N'Marketing') 
INSERT [Department] ([DepartmentID], [Name])  
VALUES (5, N'Finance') 
GO 
 
INSERT [Employee] ([EmployeeID], [FirstName], [LastName], [DepartmentID]) 
VALUES (1, N'Orlando', N'Gee', 1 ) 
INSERT [Employee] ([EmployeeID], [FirstName], [LastName], [DepartmentID]) 
VALUES (2, N'Keith', N'Harris', 2 ) 
INSERT [Employee] ([EmployeeID], [FirstName], [LastName], [DepartmentID]) 
VALUES (3, N'Donna', N'Carreras', 3 ) 
INSERT [Employee] ([EmployeeID], [FirstName], [LastName], [DepartmentID]) 
VALUES (4, N'Janet', N'Gates', 3 ) 

CROSS APPLY 與 INNER JOIN

這是一個由兩部分組成的査詢:第一個査詢從 Department 資料表中選取資料,並使用 CROSS APPLY 為 Department 資料表的每筆記錄評估 Employee 資料表;第二個査詢只是將 Department 資料表與 Employee 資料表聯結起來,以產生相同的結果:

CROSS APPLY vs INNER JOIN (88K)

第 2 部份預告

在本文介紹了 APPLY 運算子之後,第 2 部分將概述使用 APPLY 和 JOIN 之間的區別,並會講述 APPLY 的其他用法。

Navicat 文章
頻道記錄
分享
部落格封存檔