Pokud by Sql Ce uměl CTE (nevím jestli novější verze ho už náhodou neumí - vyzkoušejte), bylo by to jednoduché:
WITH NodesClosureCTE (parentTag, myTag)
AS
(
SELECT myTag AS parentTag, myTag
FROM nodesTbl
UNION ALL
SELECT NodesClosureCTE.parentTag, nodesTbl.myTag
FROM nodesTbl INNER JOIN
NodesClosureCTE ON NodesClosureCTE.myTag = nodesTbl.parentTag
)
SELECT NodesClosureCTE.myTag, nodesTbl.node
FROM NodesClosureCTE INNER JOIN
nodesTbl ON nodesTbl.myTag = NodesClosureCTE.myTag
WHERE NodesClosureCTE.parentTag = 2
ORDER BY NodesClosureCTE.myTag
Výstup:
myTag node
----- ----
2 node2
3 node21
4 node211
7 node22
8 node212
Pokud SQL Ce CTE nepodporuje, tak to přímo v SQL nepůjde. Budete to muset řešit až na klientu v C#. Jedna varianta by mohla být postupně načítat nové child uzly a "closure" budovat v paměti tj. 1) Uzel 2 přidáte do výsledků pokud víte, že existuje. Jinak jeho existenci nejprve ověříte SQL dotazem:
SELECT myTag FROM nodesTbl WHERE myTag = 2
2) Načtete pořízené uzly pro hodnoty uzlů získané v předchozím kroku - nyní na začátku pouze pro uzel 2 - SQL dotazem:
SELECT myTag FROM nodesTbl WHERE parentTag IN (2)
(Vrací 3,7) Získané hodnoty (3,7) si zapamatujete a také je (nezávisle na "zapamatování") přidáte do výsledků. 3) Opakujete krok 2 pro nově získané hodnoty v předchozím kroku:
SELECT myTag FROM nodesTbl WHERE parentTag IN (3,7)
(Vrací 4,8) Získané hodnoty (4,8) si opět zapamatujete a přidáte do výsledků. 4) Opět opakujete krok 2 pro nové hodnoty:
SELECT myTag FROM nodesTbl WHERE parentTag IN (4,8)
(Nevrací nic) Protože tento dotaz již nic nevrátil, algoritmus končí. Ve výsledku je 2,3,7,4,8
|