I have create this SQL Fiddle with the following data
userId userName managerId
====== ======== =========
1 Adam NULL
2 Brett 1
3 Chris 2
4 George 1
5 David 3
6 Elliot 5
7 Fred 5
8 Harry 4
How do I return a tree such that the data is returned in the following order:
Adam
Brett
Chris
David
Elliot
Fred
George
Harry
I'm not worried about indenting and of course I can't just order by name (just in case Fred is corrected to Alfred).
This is what I've got so far:
WITH UserCTE AS (
SELECT userId, userName, managerId, 0 AS EmpLevel
FROM Users where managerId is null
UNION ALL
SELECT usr.userId, usr.userName, usr.managerId, mgr.[EmpLevel]+1
FROM Users AS usr
INNER JOIN UserCTE AS mgr
ON usr.managerId = mgr.userId where usr.managerId IS NOT NULL
)
SELECT *
FROM UserCTE AS u
ORDER BY EmpLevel;
You need to do this by getting the complete path to each person, and then sorting by that:
WITH UserCTE AS (
SELECT userId, userName, managerId, 0 AS EmpLevel,
CONVERT(VARCHAR(MAX), '/' + userName) as path
FROM Users
WHERE managerId is null
UNION ALL
SELECT usr.userId, usr.userName, usr.managerId, mgr.[EmpLevel]+1,
CONVERT(VARCHAR(MAX), mgr.path + '/' + usr.userName)
FROM Users usr INNER JOIN
UserCTE mgr
ON usr.managerId = mgr.userId
WHERE usr.managerId IS NOT NULL -- this is unnecessary
)
SELECT *
FROM UserCTE AS u
ORDER BY path;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With