Sql Server系列:通用表表達式CTE


1 CTE語法WITH關鍵字

  通用表表達式(Common Table Express, CTE),將派生表定義在查詢的最前面。要使用CTE開始創建一個查詢,可以使用WITH關鍵字。

  CTE語法:

WITH <expression_name> [(column_name [,...n])]
    AS
    ( CTE_query_definition)
    [, <another_expression>]
<query>

  首先為CTE提供一個名稱,該名稱類似於用於派生表的別名。然后可以提供CTE將返回的列名列表;如果CTE指定了它的所有返回列,則這是可選操作。最后,在圓括號中添加CTE查詢的定義,最后添加使用CTE的主查詢。

  WITH關鍵字之前的語句必須使用分號(;)結束。

  示例

WITH cte
AS
(
    SELECT * FROM [dbo].[Product]
)

SELECT [ProductID],[ProductCode],[ProductName],[UnitPrice] FROM cte

  連接查詢示例

WITH ProductCTE([CategoryID], [ProductsCount])
AS
(
    SELECT [CategoryID],COUNT(1)
    FROM [dbo].[Product]
    GROUP BY [CategoryID]
)

SELECT c.[CategoryID],c.[CategoryName], cte.[ProductsCount]
FROM [dbo].[Category] c
INNER JOIN ProductCTE cte
    ON c.[CategoryID] = cte.[CategoryID]
ORDER BY cte.[ProductsCount]

2 使用多個CTE

  使用WITH開始語句可以定義多個CTE,不需要重復使用WITH關鍵字,每一個CTE可以使用在該語句中已經定義的任意CTE(作為其定義的一部分)。

WITH CategoryCTE
AS
(
    SELECT * FROM [dbo].[Category]
),ProductCTE
AS
(
    SELECT p.*,cte.[CategoryName] FROM [dbo].[Product] p
    INNER JOIN CategoryCTE cte
        ON p.[CategoryID] = cte.[CategoryID]
)

SELECT * FROM ProductCTE

3 遞歸CTE

  遞歸公用表表達式是在CTE內的語句中調用其自身的CTE。

  示例

WITH cte([CategoryID],[CategoryName],[ParentID],[Level])
AS
(
    -- 查詢語句
    SELECT [CategoryID],[CategoryName],[ParentID],1 AS [Level] FROM [dbo].[Category]
    WHERE [ParentID] IS NULL
    UNION ALL
    -- 遞歸語句
    SELECT c.[CategoryID],c.[CategoryName],c.[ParentID], cte.[Level] + 1
    FROM [dbo].[Category] c
    INNER JOIN cte
        ON c.[CategoryID] = cte.[ParentID]
)

SELECT [CategoryID],[CategoryName],[ParentID],[Level] FROM cte

  限制遞歸層次

WITH cte([CategoryID],[CategoryName],[ParentID],[Level])
AS
(
    -- 查詢語句
    SELECT [CategoryID],[CategoryName],[ParentID],1 AS [Level] FROM [dbo].[Category]
    WHERE [ParentID] IS NULL
    UNION ALL
    -- 遞歸語句
    SELECT c.[CategoryID],c.[CategoryName],c.[ParentID], cte.[Level] + 1
    FROM [dbo].[Category] c
    INNER JOIN cte
        ON c.[CategoryID] = cte.[ParentID]
)

SELECT [CategoryID],[CategoryName],[ParentID],[Level] FROM cte
OPTION(MAXRECURSION 2)

  Where過濾遞歸結果數據層次

WITH cte([CategoryID],[CategoryName],[ParentID],[Level])
AS
(
    -- 查詢語句
    SELECT [CategoryID],[CategoryName],[ParentID],1 FROM [dbo].[Category]
    WHERE [ParentID] IS NULL
    UNION ALL
    -- 遞歸語句
    SELECT c.[CategoryID],c.[CategoryName],c.[ParentID], [Level] + 1
    FROM [dbo].[Category] c
    INNER JOIN cte
        ON c.[CategoryID] = cte.[ParentID]
)

SELECT [CategoryID],[CategoryName],[ParentID],[Level] FROM cte
WHERE cte.[Level] <= 3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM