Mensimulasikan kolom LEVEL
Kolom level dapat dengan mudah disimulasikan dengan menambahkan penghitung di bagian rekursif:
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;
Mensimulasikan order siblings by
Mensimulasikan order siblings by
sedikit lebih rumit. Dengan asumsi kita memiliki kolom sort_order
yang mendefinisikan urutan elemen per induk (bukan urutan pengurutan keseluruhan - karena order siblings
tidak perlu) maka kita dapat membuat kolom yang memberi kita urutan pengurutan keseluruhan:
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;
Ekspresi untuk sort_path
terlihat sangat rumit karena SQL Server (setidaknya versi yang Anda gunakan) tidak memiliki fungsi sederhana untuk memformat angka dengan nol di depan. Di Postgres saya akan menggunakan array integer sehingga konversi ke varchar
tidak perlu - tetapi itu juga tidak berfungsi di SQL Server.