首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL Server CROSS APPLY 與 INNER JOIN 區別深度解析

     編輯:程式設計綜合問答

SQL Server 2005 引入的 CROSS APPLY 與 INNER JOIN 都能關聯表,但適用場景本質不同。本文通過對比分析,闡明 CROSS APPLY 的獨特價值——表值函數調用與分組後逐行處理。

語法對比

-- INNER JOIN:表與表關聯
SELECT * FROM TableA a INNER JOIN TableB b ON a.id = b.a_id;

-- CROSS APPLY:表與表值函數/子查詢關聯,右側可引用左側列
SELECT * FROM TableA a CROSS APPLY fn_GetRelated(a.id);

-- OUTER APPLY:類似 LEFT JOIN,右側無結果也保留左側行
SELECT * FROM TableA a OUTER APPLY fn_GetRelated(a.id);

核心區別

特性INNER JOINCROSS APPLY
右側對象表/視圖/子查詢表值函數/關聯子查詢
引用左側列ON 條件中函數參數/子查詢 WHERE 中
逐行執行否(集合運算)是(對左側每行單獨執行右側)
無匹配行過濾掉過濾掉(OUTER APPLY 保留)

典型應用場景:分組後 Top N

需求:查詢每個部門薪資最高的 2 名員工。

CROSS APPLY 寫法(簡潔高效)

SELECT d.DeptName, e.EmpName, e.Salary
FROM Department d
CROSS APPLY (
    SELECT TOP 2 EmpName, Salary
    FROM Employee
    WHERE DeptID = d.DeptID
    ORDER BY Salary DESC
) e;

INNER JOIN 寫法(複雜)

-- 需窗口函數 ROW_NUMBER() OVER (PARTITION BY DeptID ORDER BY Salary DESC)
-- 或相關子查詢 + NOT EXISTS,可讀性差、性能往往較差

另一場景:調用表值函數

-- 假設函數 fn_SplitString(@str, @delim) 返回表 (id, val)
SELECT t.id, s.val
FROM MyTable t
CROSS APPLY fn_SplitString(t.csv_col, ',') s;
-- INNER JOIN 無法直接調用函數並傳遞當前行列值

性能考量

  • CROSS APPLY 對左側每行執行右側邏輯,左側行數大時可能較慢
  • 配合適當索引、小結果集驅動大表時效果最好
  • 執行計劃中顯示為 Nested Loops + Table Valued Function

總結

  • INNER JOIN:標準表關聯,集合運算,優化器充分優化
  • CROSS APPLY:逐行調用表值函數、分組後關聯子查詢 的專用工具
  • 能用 JOIN 解決的優先用 JOIN;需要「每行傳參數調函數」或「分組 Top N」時,CROSS APPLY 是唯一/最優選擇
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved