再帰的 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