首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> SQL Server 2005

SQL Server CROSS APPLY 與 OUTER APPLY 完整應用詳解

     編輯:SQL Server 2005

核心差異

運算子行為
CROSS APPLY右側表值函數回傳空集合 → 左側列被過濾掉 (相當於 INNER JOIN)
OUTER APPLY右側回傳空集合 → 左側列保留,右側欄位補 NULL (相當於 LEFT JOIN)

場景一:拆分分隔符號欄位 (CROSS APPLY)

-- 表值函數:字串分割
CREATE FUNCTION dbo.Split(@Sql VARCHAR(8000), @Sep VARCHAR(10))
RETURNS @t TABLE (Val VARCHAR(100))
AS BEGIN
    DECLARE @i INT = CHARINDEX(@Sep, @Sql);
    WHILE @i > 0 BEGIN
        INSERT @t VALUES (LEFT(@Sql, @i-1));
        SET @Sql = SUBSTRING(@Sql, @i+1, LEN(@Sql)-@i);
        SET @i = CHARINDEX(@Sep, @Sql);
    END
    IF @Sql <> '' INSERT @t VALUES (@Sql);
    RETURN;
END
GO

-- 使用:將 LargeTable.Name 以 ':' 拆成多列
SELECT lt.Id, s.Val
FROM dbo.LargeTable lt
CROSS APPLY dbo.Split(lt.Name, ':') s
WHERE s.Val <> '';

場景二:每位供應商取最高價前 2 產品 (OUTER APPLY)

-- 表值函數:依供應商取 Top 2
CREATE FUNCTION dbo.fn_TopProducts(@SupId INT)
RETURNS TABLE
AS RETURN
    SELECT TOP 2 Id AS ProductId, ProductName, UnitPrice
    FROM dbo.Products
    WHERE SupplierId = @SupId
    ORDER BY UnitPrice DESC;
GO

-- OUTER APPLY:無產品供應商仍保留
SELECT s.Id AS SupplierId, s.CompanyName, p.ProductId, p.UnitPrice
FROM dbo.Supplier s
OUTER APPLY dbo.fn_TopProducts(s.Id) p;

執行邏輯順序

  1. 先邏輯計算左側資料集 (外部查詢)。
  2. 對左側每一列,將其欄位當參數傳入右側表值函數。
  3. 函數回傳結果集與該列進行 CROSS/OUTER JOIN。

官方範例:部門-員工遞迴

CROSS APPLY fn_getsubtree(D.deptmgrid) 只回傳有主管的部門;
OUTER APPLY 會多出一列 Gardening / NULL / NULL ... (無主管部門)。

適用版本

SQL Server 2005+ 全版本支援;Azure SQL Database / Managed Instance 亦支援。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved