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.