我認爲遞歸CTE的格式足夠寫下來,但仍然發現自己無法手動處理它(假裝自己是SQL引擎並使用筆訪問結果集,紙)。 I've found this,這與我正在尋找的接近,但不夠詳細。我沒有問題通過C++遞歸函數進行追蹤並理解其運行方式 - 但對於SQL,我不明白引擎知道爲什麼或如何停止。是否每次都調用錨點和遞歸塊,還是在稍後的迭代中跳過錨點? (我懷疑它,但我試圖表達我對它似乎跳躍的方式的困惑。)如果每次都調用錨點,那麼錨點在最終結果中不會多次出現?我希望有人可以做一個細分第1行第2行,等等。結果集累積會發生什麼以及「內存中」是什麼。遞歸CTE如何逐行運行?
我偷了我的example from this page的自由,因爲它似乎是最容易理解的。
DECLARE @tbl TABLE (
Id INT
, [Name] VARCHAR(20)
, ParentId INT
)
INSERT INTO @tbl(Id, Name, ParentId)
VALUES
(1, 'Europe', NULL)
,(2, 'Asia', NULL)
,(3, 'Germany', 1)
,(4, 'UK', 1)
,(5, 'China', 2)
,(6, 'India', 2)
,(7, 'Scotland', 4)
,(8, 'Edinburgh', 7)
,(9, 'Leith', 8)
;
WITH abcd
AS (
-- anchor
SELECT id, Name, ParentID,
CAST(Name AS VARCHAR(1000)) AS Path
FROM @tbl
WHERE ParentId IS NULL
UNION ALL
--recursive member
SELECT t.id, t.Name, t.ParentID,
CAST((a.path + '/' + t.Name) AS VARCHAR(1000)) AS "Path"
FROM @tbl AS t
JOIN abcd AS a
ON t.ParentId = a.id
)
SELECT * FROM abcd
可愛的解釋Quassnoi! – Baaju 2010-07-06 16:05:05
優秀示範! – 2016-12-12 09:45:03