Code:
1>
2> select @@version as ver
3> go
ver
--------------------------------------------------------------------------------------------------------------------------------------------
Adaptive Server Enterprise/16.0 GA PL01/EBF 22544 SMP/P/x86_64/Enterprise Linux/ase160sp00pl01/3523/64-bit/FBO/Tue Apr 15 13:24:31 2014
(1 row affected)
1>
2>
3> --
4> create table emp (
5> id int not null,
6> name varchar(20) not null,
7> desg varchar(20) not null,
8> mgr int null
9> )
10> go
1>
2> insert into emp (id, name, desg, mgr)
3> select 10, 'Adam', 'CEO', null union all
4> select 20, 'Brian', 'President', 10 union all
5> select 30, 'Chuck', 'VP', 10 union all
6> select 40, 'Dan', 'Architect', 20 union all
7> select 50, 'Eric', 'SSE', 20 union all
8> select 60, 'Fred', 'Team Lead', 30 union all
9> select 70, 'Greg', 'SE', 60 union all
10> select 100, 'Patrick', 'Executive', null union all
11> select 200, 'Quinn', 'President', 100 union all
12> select 300, 'Roger', 'VP', 100
13> go
(10 rows affected)
1>
2> -- Two hierarchies exist; one starting from Adam and the other from Patrick
3> select * from emp
4> go
id name desg mgr
----------- -------------------- -------------------- -----------
10 Adam CEO NULL
20 Brian President 10
30 Chuck VP 10
40 Dan Architect 20
50 Eric SSE 20
60 Fred Team Lead 30
70 Greg SE 60
100 Patrick Executive NULL
200 Quinn President 100
300 Roger VP 100
(10 rows affected)
1>
2> -- Create the temp table
3> --
4> create table #hier_tree (
5> id int not null,
6> name varchar(20) not null,
7> desg varchar(20) not null,
8> mgr int null,
9> depth int not null,
10> root varchar(20) not null,
11> path varchar(60) not null
12> )
13> go
1>
2> -- Seed query
3> insert into #hier_tree (id, name, desg, mgr, depth, root, path)
4> select e.id, e.name, e.desg, e.mgr,
5> 1 as depth,
6> e.name as root,
7> '/' + e.name as path
8> from emp e
9> where e.mgr is null
10> go
(2 rows affected)
1>
2> --
3> -- The top level root nodes (Adam and Patrick) should be loaded now
4> --
5> select * from #hier_tree
6> go
id name desg mgr depth root path
----------- -------------------- -------------------- ----------- ----------- -------------------- ------------------------------------------------------------
10 Adam CEO NULL 1 Adam /Adam
100 Patrick Executive NULL 1 Patrick /Patrick
(2 rows affected)
1>
2> --
3> -- Now load the entire hierarchy tree using a while loop, recursively joining the temp table with emp
4> --
5> declare @depth int
6> declare @rowcount int
7> set @depth = 1
8> while (1 = 1)
9> begin
10> insert into #hier_tree (id, name, desg, mgr, depth, root, path)
11> select e.id, e.name, e.desg, e.mgr,
12> h.depth + 1 as depth,
13> h.root,
14> h.path + '/' + e.name as path
15> from #hier_tree h, emp e
16> where h.id = e.mgr
17> and h.depth = @depth
18> set @rowcount = @@ROWCOUNT
19> if (@rowcount = 0)
20> break
21> set @depth = @depth + 1
22> end
23> go
(1 row affected)
(4 rows affected)
(1 row affected)
(1 row affected)
(3 rows affected)
(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)
(1 row affected)
(0 rows affected)
(1 row affected)
1>
2> --
3> -- Check the results
4> --
5> select * from #hier_tree
6> go
id name desg mgr depth root path
----------- -------------------- -------------------- ----------- ----------- -------------------- ------------------------------------------------------------
10 Adam CEO NULL 1 Adam /Adam
100 Patrick Executive NULL 1 Patrick /Patrick
20 Brian President 10 2 Adam /Adam/Brian
30 Chuck VP 10 2 Adam /Adam/Chuck
200 Quinn President 100 2 Patrick /Patrick/Quinn
300 Roger VP 100 2 Patrick /Patrick/Roger
40 Dan Architect 20 3 Adam /Adam/Brian/Dan
50 Eric SSE 20 3 Adam /Adam/Brian/Eric
60 Fred Team Lead 30 3 Adam /Adam/Chuck/Fred
70 Greg SE 60 4 Adam /Adam/Chuck/Fred/Greg
(10 rows affected)
1>
2> --
3> -- Sort the data so each hierarchy tree is seen clearly
4> --
5> select * from #hier_tree order by root, depth
6> go
id name desg mgr depth root path
----------- -------------------- -------------------- ----------- ----------- -------------------- ------------------------------------------------------------
10 Adam CEO NULL 1 Adam /Adam
20 Brian President 10 2 Adam /Adam/Brian
30 Chuck VP 10 2 Adam /Adam/Chuck
40 Dan Architect 20 3 Adam /Adam/Brian/Dan
50 Eric SSE 20 3 Adam /Adam/Brian/Eric
60 Fred Team Lead 30 3 Adam /Adam/Chuck/Fred
70 Greg SE 60 4 Adam /Adam/Chuck/Fred/Greg
100 Patrick Executive NULL 1 Patrick /Patrick
300 Roger VP 100 2 Patrick /Patrick/Roger
200 Quinn President 100 2 Patrick /Patrick/Quinn
(10 rows affected)
1>
2> --
3> -- Testcase over. Time to clean up...
4> --
5> drop table #hier_tree
6> go
1>
2> --
3> drop table emp
4> go
1>
2>