Můžete použít rekurzivní společné tabulka výraz (CTE);
WITH cte(Root, Level, Parent, Child) AS (
SELECT Parent, 0, Parent, Child FROM Table1
WHERE Parent NOT IN (SELECT Child FROM Table1)
UNION ALL
SELECT cte.Root, cte.Level + 1, t1.Parent, t1.Child
FROM cte
JOIN Table1 t1
ON cte.Child = t1.Parent AND cte.Level < 10
)
SELECT * FROM cte ORDER BY Root, Level;
V podstatě rekurzivní CTE používá základní případ (najít všechny výchozí body). Ten používá;
SELECT Parent, 0, Parent, Child FROM Table1
WHERE Parent NOT IN (SELECT Child FROM Table1)
...který najde všechny rodiče, že je v řadách, kde rodiče je nikdy zmínil se v tabulce jako dítě. To pak nastaví ty rodiče jako "Root" a nastaví úroveň na hodnotu 0.
To pak pokračuje, aby našli dítě, které řádky pro root pomocí;
SELECT cte.Root, cte.Level + 1, t1.Parent, t1.Child
FROM cte
JOIN Table1 t1
ON cte.Child = t1.Parent AND cte.Level < 10
...což v podstatě jen najde další dítě (řádek, který má tento řádky dítě jako rodič) při zachování kořene a zvyšuje level o 1.
To také omezuje rekurze na 10 úrovní, jen v případě, že je smyčka v datech.
A dbfiddle otestovat