APPLY 允許右側表值函數引用左側資料列的欄位當參數,邏輯順序:先算左側 → 每列呼叫右側函數 → 合併結果。這是 JOIN 無法做到的 (JOIN 兩側獨立計算)。
SELECT lt.Id, s.Val FROM dbo.LargeTable lt CROSS APPLY dbo.Split(lt.Name, ':') s WHERE s.Val <> '';
若某列拆分結果為空集,該列被過濾 (等同 INNER JOIN)。
CREATE FUNCTION dbo.fn_TopProducts(@SupId INT)
RETURNS TABLE
AS RETURN
SELECT TOP 2 Id, ProductName, UnitPrice
FROM dbo.Products
WHERE SupplierId = @SupId
ORDER BY UnitPrice DESC;
GO
SELECT s.Id, s.CompanyName, p.ProductId, p.UnitPrice
FROM dbo.Supplier s
OUTER APPLY dbo.fn_TopProducts(s.Id) p;
無產品供應商仍保留,右側欄位為 NULL (等同 LEFT JOIN)。
| 場景 | 運算子 | 結果 |
|---|---|---|
| 右側函數可能回空集,但需保留左側列 | OUTER APPLY | 左側全保留,右側補 NULL |
| 右側函數必須有資料才有意義 | CROSS APPLY | 自動過濾空集列 |