ReportingAnalyst
MIS
I have a simple table Tree which has 6 rows of data. I want to convert this data to nested table Stack. But it seems that I am entering into an infinite loop. Any ideas what I am doing wrong...
Code:
--select member_subordinate, member_manager
--from amp_allmysubordinates_postings
--WHERE Owner_DateOfPost = (SELECT MAX(Owner_DateOfPost) FROM Amp_AllMySubordinates_POstings)
IF Exists(Select * From Information_Schema.Tables Where Table_Name = 'Tree'
and TABLE_TYPE ='BASE TABLE')
Begin
drop table [dbo].[Tree]
End
GO
create table tree
(emp Char(10) Not Null,
Boss Char(10));
--Insert sample data into tree
INSERT INTO TREE Values ('Albert', NULL);
INSERT INTO TREE Values ('Bert', 'Albert');
INSERT INTO TREE Values ('Chuck', 'Albert');
INSERT INTO TREE Values ('Donna', 'Chuck');
INSERT INTO TREE Values ('Eddie', 'Chuck');
INSERT INTO TREE Values ('Fred', 'Chuck');
IF Exists(Select * From Information_Schema.Tables Where Table_Name = 'Stack'
and TABLE_TYPE ='BASE TABLE')
BEGIN
drop table [dbo].[Stack]
END
GO
CREATE TABLE Stack
(Stack_top INTEGER Not Null,
employee Char(10) Not Null,
Lft Integer,
Rgt Integer);
--Select * from Tree
--Select * from Stack
BEGIN
DECLARE @lft_rgt INTEGER, @stack_pointer INTEGER, @max_lft_rgt INTEGER;
SET @max_lft_rgt = 2 * (SELECT COUNT(*) FROM Tree);
INSERT INTO Stack (Stack_top, employee, Lft, Rgt)
SELECT 1, emp, 1, @max_lft_rgt
FROM Tree
WHERE boss IS NULL;
SET @lft_rgt = 2;
SET @stack_pointer = 1;
DELETE FROM Tree
WHERE boss IS NULL;
[b]--Till here it is working fine. I can see the insert into Stack
--for the top most manager with Stack_top=1, emp=Albert, lft=1, rgt=12(2*6 rows of the table-tree)
--I can also see the row of Albert deleted from the table Tree because his 'Boss' column has a null value
[/b]
-- The stack is ready and ready to use
WHILE (@lft_rgt < @max_lft_rgt)
Begin
IF EXISTS(SELECT * FROM Stack AS S1, Tree AS T1
WHERE S1.employee = T1.boss
AND S1.stack_top = @stack_pointer)
BEGIN --push when stack_top has subordinates and set the lft value
INSERT INTO Stack(Stack_top, employee, Lft, Rgt)
SELECT (@stack_pointer + 1), MIN(T1.emp), @lft_rgt, NULL
FROM Stack AS S1, Tree AS T1
WHERE S1.employee = T1.boss
AND S1.stack_top = @stack_pointer;
--remove this row from Tree
DELETE FROM Tree
WHERE emp = (SELECT employee FROM Stack WHERE stack_top = @stack_pointer + 1);
SET @stack_pointer = @stack_pointer + 1;
END --push
ELSE
BEGIN --pop the stack and set the rgt value
UPDATE Stack
SET rgt = @lft_rgt,
stack_top = -stack_top
WHERE stack_top = @stack_pointer
SET @stack_pointer = @stack_pointer - 1;
END --pop
END; -- IF
END; --While