sqlserver遞迴查詢示例
阿新 • • 發佈:2021-06-17
示例題目:
有一張表T0617,裡面的資料如下:
希望得到如下結果
該如何寫這個查詢?
示例資料:
CREATE TABLE T0617
(ID INT,
PID INT
)
INSERT INTO T0617 VALUES
(1,0),(2,1),(3,2),(4,3)
查詢sql:
WITH CTE AS (
SELECT ID,PID,CAST(ID AS VARCHAR(1000)) AS PATH
FROM T0617
WHERE ID = 1
UNION ALL
SELECT A.ID,A.PID,CAST ((CTE.PATH + '->' + CAST(A.ID AS VARCHAR (10))) AS VARCHAR(1000)) AS PATH
FROM T0617 A
INNER JOIN CTE ON A.PID = CTE.ID
)
SELECT * FROM CTE
思路解析:
需要使用with as語句,即公用表表達式。官方文件地址:https://docs.microsoft.com/zh-cn/sql/t-sql/queries/with-common-table-expression-transact-sql?view=sql-server-ver15
with as語句官方定義:指定臨時命名的結果集,這些結果集稱為公用表表達式 (CTE)。公用表表達式可以包括對自身的引用。 這種表示式稱為遞迴公用表表達式。
通俗理解,with as語句為子查詢部分,可以定義一個sql片段,該片段可以被整個sql語句使用,並且with as語句具體可以對自身引用的特性,利用該特性可以實現遞迴查詢。
遞迴sql解析:遞迴查詢需要包含兩個部分,上半部分為定位點,下半部分與公用表表達式自身進行關聯查詢。比如第一次迴圈的時候只查詢出上半部分,第二次迴圈的時候,下半部分與第一次迴圈的結果進行關聯查詢,第三次與第二次的結果進行關聯,以此類推,直到無法找到與上一次結果進行關聯時停止。