Simulering af LEVEL-kolonnen
Niveaukolonnen kan let simuleres ved at inkrementere en tæller i den rekursive del:
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;
Simulering af order siblings by
Simulering af order siblings by
er lidt mere kompliceret. Forudsat at vi har en kolonne sort_order
der definerer rækkefølgen af elementer pr. forælder (ikke den overordnede sorteringsrækkefølge - for så order siblings
ikke ville være nødvendigt), så kan vi oprette en kolonne, som giver os en overordnet sorteringsrækkefølge:
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;
Udtrykket for sort_path
ser så kompliceret ud, fordi SQL Server (i hvert fald den version du bruger) ikke har en simpel funktion til at formatere et tal med foranstillede nuller. I Postgres ville jeg bruge et heltalsarray, så konverteringen til varchar
er ikke nødvendigt - men det virker heller ikke i SQL Server.