SQL server 中 CROSS APPLY的使用及用途
CROSS APPLY 是 SQL Server 中的一個(gè)操作符,用于將一個(gè)表表達(dá)式(如子查詢(xún)、函數(shù)等)與外部表進(jìn)行連接。CROSS APPLY 類(lèi)似于 INNER JOIN,但它允許你在一個(gè)查詢(xún)中多次引用外部表的行,并且可以動(dòng)態(tài)地生成結(jié)果集。
基本語(yǔ)法
SELECT ... FROM table1 CROSS APPLY (table_expression) AS alias
用途
1. 多行結(jié)果:當(dāng)子查詢(xún)或表表達(dá)式返回多行結(jié)果時(shí),CROSS APPLY 可以將這些結(jié)果與外部表的每一行進(jìn)行組合。
2. 動(dòng)態(tài)生成結(jié)果:CROSS APPLY 可以根據(jù)外部表的每一行動(dòng)態(tài)生成結(jié)果集。
3. 復(fù)雜計(jì)算:在需要對(duì)每個(gè)外部行進(jìn)行復(fù)雜計(jì)算或處理時(shí),CROSS APPLY 非常有用。
示例
假設(shè)我們有一個(gè) Employees 表和一個(gè) Orders 表,我們希望獲取每個(gè)員工的最新訂單信息。
表結(jié)構(gòu)
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
Name VARCHAR(50)
);
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
EmployeeID INT,
OrderDate DATE,
Amount DECIMAL(10, 2)
);
INSERT INTO Employees (EmployeeID, Name)
VALUES (1, '張三'), (2, '李四');
INSERT INTO Orders (OrderID, EmployeeID, OrderDate, Amount)
VALUES
(1, 1, '2024-01-01', 100.00),
(2, 1, '2024-01-15', 150.00),
(3, 2, '2024-02-01', 200.00),
(4, 2, '2024-02-10', 250.00);使用 CROSS APPLY 獲取每個(gè)員工的最新訂單
SELECT e.EmployeeID, e.Name, o.OrderID, o.OrderDate, o.Amount
FROM Employees e
CROSS APPLY (
SELECT TOP 1 *
FROM Orders o
WHERE o.EmployeeID = e.EmployeeID
ORDER BY o.OrderDate DESC
) AS o;結(jié)果
執(zhí)行上述查詢(xún)后,結(jié)果將會(huì)是:

1. 外部表:Employees 表是外部表。
2. 表表達(dá)式:CROSS APPLY 后面的子查詢(xún)是一個(gè)表表達(dá)式,它為每個(gè)員工返回最新的訂單。
3. 連接條件:子查詢(xún)中的 WHERE o.EmployeeID = e.EmployeeID 確保了子查詢(xún)只處理當(dāng)前員工的訂單。
4. TOP 1:TOP 1 和 ORDER BY o.OrderDate DESC 確保了子查詢(xún)返回每個(gè)員工的最新訂單。
與其他操作符的區(qū)別
•CROSS APPLY:類(lèi)似于 INNER JOIN,但允許子查詢(xún)引用外部表的每一行。
•OUTER APPLY:類(lèi)似于 LEFT JOIN,即使子查詢(xún)沒(méi)有返回任何結(jié)果,外部表的行也會(huì)保留。
示例:
使用 OUTER APPLY假設(shè)我們希望即使某些員工沒(méi)有訂單,也能顯示他們的信息。
SELECT e.EmployeeID, e.Name, o.OrderID, o.OrderDate, o.Amount
FROM Employees e
OUTER APPLY (
SELECT TOP 1 *
FROM Orders o
WHERE o.EmployeeID = e.EmployeeID
ORDER BY o.OrderDate DESC
) AS o;結(jié)果

如果某個(gè)員工沒(méi)有訂單,結(jié)果集中對(duì)應(yīng)的部分將顯示為 NULL。
總結(jié)
CROSS APPLY 和 OUTER APPLY 是 SQL Server 中非常強(qiáng)大的操作符,特別適用于需要對(duì)每個(gè)外部行進(jìn)行復(fù)雜處理或動(dòng)態(tài)生成結(jié)果集的場(chǎng)景。希望這些示例能幫助你更好地理解和使用這些操作符。
到此這篇關(guān)于SQL server 中 CROSS APPLY的使用的文章就介紹到這了,更多相關(guān)SQL server CROSS APPLY使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sqlserver中比較一個(gè)字符串中是否含含另一個(gè)字符串中的一個(gè)字符
sql中比較一個(gè)字符串中是否含有另一個(gè)字符串中的一個(gè)字符的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2010-09-09
SQL?CTE?(Common?Table?Expression)?高級(jí)用法與最佳實(shí)踐
CTE(Common?Table?Expression,公用表表達(dá)式)是SQL中的"命名臨時(shí)結(jié)果集",通過(guò)?WITH?關(guān)鍵字定義,僅在當(dāng)前查詢(xún)中生效,本文給大家介紹SQL?CTE?(Common?Table?Expression)?高級(jí)用法與最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧2025-10-10
mssql數(shù)據(jù)庫(kù)系統(tǒng)崩潰后的一般處理步驟與方法
mssql數(shù)據(jù)庫(kù)系統(tǒng)崩潰后的一般處理步驟與方法...2007-03-03
ACCESS數(shù)據(jù)庫(kù)的壓縮,備份,還原,下載,刪除的實(shí)現(xiàn)
ACCESS數(shù)據(jù)庫(kù)的壓縮,備份,還原,下載,刪除的實(shí)現(xiàn)...2006-08-08
Sql中Update的From語(yǔ)句及常見(jiàn)更新操作方式
在SQL中,更新數(shù)據(jù)是數(shù)據(jù)庫(kù)管理中常見(jiàn)且重要的操作之一,本文主要介紹了Sql中Update的From語(yǔ)句及常見(jiàn)更新操作方式,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04
獲取數(shù)據(jù)庫(kù)中兩個(gè)時(shí)間字段的相差天數(shù)及ABS/DATEDIFF函數(shù)應(yīng)用
本文將詳細(xì)介紹獲取數(shù)據(jù)庫(kù)中兩個(gè)時(shí)間字段的相差天數(shù)及ABS/DATEDIFF函數(shù)應(yīng)用感興趣的朋友可以了解下哦,希望本文對(duì)你鞏固ABS/DATEDIFF函數(shù)有所幫助2013-01-01
SQL Server 日期和時(shí)間的內(nèi)部存儲(chǔ)過(guò)程
在SQL Server的內(nèi)部存儲(chǔ)中,日期和時(shí)間不是以字符串的形式存儲(chǔ)的,而是使用整數(shù)來(lái)存儲(chǔ)的。這篇文章主要介紹了SQL Server 日期和時(shí)間的內(nèi)部存儲(chǔ),需要的朋友可以參考下2019-12-12

