我想我已经掌握了递归 CTE 的格式,足以编写一个,但仍然发现自己非常沮丧,因为我无法手动处理一个(假装自己是 SQL 引擎并用笔和纸到达结果集) 。我找到了这个,这与我正在寻找的内容很接近,但不够详细。我可以毫无问题地跟踪 C++ 递归函数并理解它是如何运行的——但对于 SQL,我不明白引擎为什么或如何知道停止。锚点和递归块是否每次都会被调用,或者锚点是否在以后的迭代中被跳过? (我对此表示怀疑,但我试图表达我对它似乎跳跃的方式的困惑。)如果每次都调用锚点,那么锚点如何在最终结果中不会出现多次?我希望有人可以分解第 1 行、第 2 行等,随着结果集的积累,会发生什么以及“内存中”的内容。
我冒昧地偷了我的此页面的示例,因为它似乎是最容易理解的。
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