Simulazione della colonna LIVELLO
La colonna del livello può essere facilmente simulata incrementando un contatore nella parte ricorsiva:
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;
Simulare order siblings by
Simulazione di order siblings by è un po' più complicato. Supponendo di avere una colonna sort_order che definisce l'ordine degli elementi per genitore (non l'ordinamento generale, perché quindi order siblings non sarebbe necessario) quindi possiamo creare una colonna che ci dia un ordinamento generale:
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'espressione per sort_path sembra così complicato perché SQL Server (almeno la versione che stai utilizzando) non ha una semplice funzione per formattare un numero con zeri iniziali. In Postgres userei un array intero in modo che la conversione in varchar non è necessario, ma non funziona nemmeno in SQL Server.