Simulation der LEVEL-Spalte
Die Level-Spalte kann einfach simuliert werden, indem im rekursiven Teil ein Zähler erhöht wird:
WITH tree (empid, name, level) AS (
SELECT empid, name, 1 as level
FROM emp
WHERE name = 'Joan'
UNION ALL
SELECT child.empid, child.name, parent.level + 1
FROM emp as child
JOIN tree parent on parent.empid = child.mgrid
)
SELECT name
FROM tree;
Simulieren von order siblings by
Simulation der order siblings by
ist etwas komplizierter. Angenommen, wir haben eine Spalte sort_order
die die Reihenfolge der Elemente pro Elternelement definiert (nicht die Gesamtsortierreihenfolge - denn dann order siblings
wäre nicht notwendig), dann können wir eine Spalte erstellen, die uns eine allgemeine Sortierreihenfolge gibt:
WITH tree (empid, name, level, sort_path) AS (
SELECT empid, name, 1 as level,
cast('/' + right('000000' + CONVERT(varchar, sort_order), 6) as varchar(max))
FROM emp
WHERE name = 'Joan'
UNION ALL
SELECT child.empid, child.name, parent.level + 1,
parent.sort_path + '/' + right('000000' + CONVERT(varchar, child.sort_order), 6)
FROM emp as child
JOIN tree parent on parent.empid = child.mgrid
)
SELECT *
FROM tree
order by sort_path;
Der Ausdruck für sort_path
sieht so kompliziert aus, weil SQL Server (zumindest die von Ihnen verwendete Version) keine einfache Funktion hat, um eine Zahl mit führenden Nullen zu formatieren. In Postgres würde ich ein Integer-Array verwenden, damit die Konvertierung in varchar
ist nicht notwendig - aber das funktioniert auch nicht in SQL Server.