Simulación de la columna NIVEL
La columna de nivel se puede simular fácilmente incrementando un contador en la parte recursiva:
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;
Simular order siblings by
Simulando el order siblings by
es un poco más complicado. Suponiendo que tenemos una columna sort_order
que define el orden de los elementos por padre (no el orden de clasificación general, porque entonces order siblings
no sería necesario), entonces podemos crear una columna que nos dé un orden de clasificación general:
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;
La expresión para sort_path
parece tan complicado porque SQL Server (al menos la versión que está utilizando) no tiene una función simple para formatear un número con ceros a la izquierda. En Postgres, usaría una matriz de enteros para que la conversión a varchar
no es necesario, pero eso tampoco funciona en SQL Server.