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

SQL Server CTE 語法與遞歸查詢完整教學

     編輯:關於SqlServer

通用資料表運算式 (CTE) 是定義於單一陳述式執行範圍內的暫時結果集,不儲存為物件,僅於查詢期間有效。支援自我參考與多次引用,適合簡化複雜查詢與實作遞歸邏輯。

基本 CTE 結構

WITH CTE名稱 [(欄位清單)]
AS
(
    查詢定義
)
後續查詢引用 CTE名稱;

範例:簡單 CTE

WITH TEST_CTE AS (SELECT * FROM test4)
SELECT * FROM TEST_CTE;

指定欄位別名

WITH TEST_CTE(id) AS (SELECT id FROM test4)
SELECT * FROM TEST_CTE;

遞歸 CTE 查詢階層資料

建立父子關係測試表:

CREATE TABLE test5 (id INT, name VARCHAR(50), parentid INT);
INSERT INTO test5 VALUES
(1,'父類1',0),(2,'父類2',0),(3,'父類3',0),
(11,'子類11',1),(12,'子類12',1),
(111,'子子類111',11),
(22,'子類22',2),(222,'子子類222',22);

查詢「父類1」及其所有後代:

WITH Test_Recursion(id, name, parentid, [level])
AS
(
    -- 錨點成員:起始節點
    SELECT id, name, parentid, 0 FROM test5 WHERE id = 1
    UNION ALL
    -- 遞歸成員:自我聯結
    SELECT a.id, a.name, a.parentid, b.[level] + 1
    FROM test5 a
    JOIN Test_Recursion b ON a.parentid = b.id
)
SELECT * FROM Test_Recursion;

結果:

idnameparentidlevel
1父類100
11子類1111
12子類1211
111子子類111112

關鍵規則

  • 錨點成員(不參考 CTE 本身)必須置於第一個 UNION ALL 之前。
  • 遞歸成員與錨點成員間必須用 UNION ALL 連接。
  • 預設最大遞歸層數 100,可用 OPTION (MAXRECURSION n) 調整。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved