Mô phỏng cột LEVEL
Cột mức có thể dễ dàng được mô phỏng bằng cách tăng bộ đếm trong phần đệ quy:
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;
Mô phỏng order siblings by
Mô phỏng order siblings by
phức tạp hơn một chút. Giả sử chúng ta có một cột sort_order
xác định thứ tự của các phần tử trên mỗi phụ huynh (không phải thứ tự sắp xếp tổng thể - vì sau đó order siblings
sẽ không cần thiết) sau đó chúng ta có thể tạo một cột cung cấp cho chúng ta một thứ tự sắp xếp tổng thể:
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;
Biểu thức cho sort_path
trông rất phức tạp vì SQL Server (ít nhất là phiên bản bạn đang sử dụng) không có chức năng đơn giản để định dạng một số với các số không ở đầu. Trong Postgres, tôi sẽ sử dụng một mảng số nguyên để chuyển đổi thành varchar
không cần thiết - nhưng điều đó cũng không hoạt động trong SQL Server.