Je pense que j'ai le format de Récursive d'expressions de table communes vers le bas assez bien pour en écrire une, mais encore à trouver moi-même frustré de pas de fin que je ne peux pas traiter manuellement une (faire semblant d'être le moteur SQL de moi-même et d'atteindre le résultat fixé avec un stylo et du papier). J'ai trouvé ceci, qui est proche de ce que je cherche, mais pas assez détaillé. Je n'ai pas de problème de suivi par le biais d'un C++ fonction récursive, et de comprendre comment il fonctionne, mais SQL je ne comprends pas pourquoi ou comment le moteur sait s'arrêter. L'ancre et récursive bloc appelée à chaque fois, ou est le point d'ancrage sauté au plus tard itérations? (J'en doute mais je vais essayer à l'expression de ma confusion à propos de la façon dont il semble à sauter partout.) Si l'ancre est appelée à chaque fois, comment l'ancrage de ne pas apparaître plusieurs fois dans le résultat final? J'espère que quelqu'un peut juste faire une pause en bas de la ligne 1 ligne 2, etc. ce qui se passe et ce qui est "en mémoire" comme le jeu de résultats s'accumule.
J'ai pris la liberté de voler mon exemple à partir de cette page, car il semble être le plus facile à comprendre.
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