Simulation de la colonne LEVEL
La colonne de niveau peut facilement être simulée en incrémentant un compteur dans la partie récursive :
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;
Simuler order siblings by
Simulation de la order siblings by
est un peu plus compliqué. En supposant que nous ayons une colonne sort_order
qui définit l'ordre des éléments par parent (et non l'ordre de tri global - car alors order siblings
ne serait pas nécessaire) alors nous pouvons créer une colonne qui nous donne un ordre de tri global :
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;
L'expression pour le sort_path
semble si compliqué car SQL Server (au moins la version que vous utilisez) n'a pas de fonction simple pour formater un nombre avec des zéros non significatifs. Dans Postgres, j'utiliserais un tableau d'entiers pour que la conversion en varchar
n'est pas nécessaire - mais cela ne fonctionne pas non plus dans SQL Server.