1. 程式人生 > 其它 >sqlserver遞迴查詢示例

sqlserver遞迴查詢示例

示例題目:

有一張表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解析:遞迴查詢需要包含兩個部分,上半部分為定位點,下半部分與公用表表達式自身進行關聯查詢。比如第一次迴圈的時候只查詢出上半部分,第二次迴圈的時候,下半部分與第一次迴圈的結果進行關聯查詢,第三次與第二次的結果進行關聯,以此類推,直到無法找到與上一次結果進行關聯時停止。