我认为我已经很好地掌握了递归 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