Common Table Expression in SQL server - Recursive Queries

-- Create an Employee table.
CREATE TABLE dbo.MyEmployees
(
EmployeeID smallint NOT NULL,
FirstName nvarchar(30) NOT NULL,
LastName nvarchar(40) NOT NULL,
Title nvarchar(50) NOT NULL,
DeptID smallint NOT NULL,
ManagerID int NULL,
CONSTRAINT PK_EmployeeID PRIMARY KEY CLUSTERED (EmployeeID ASC)
)
-- Populate the table with values.
INSERT INTO dbo.MyEmployees VALUES
(1, N'Ken', N'Sánchez', N'Chief Executive Officer',16,NULL)
INSERT INTO dbo.MyEmployees VALUES (273, N'Brian', N'Welcker', N'Vice President of Sales',3,1)
INSERT INTO dbo.MyEmployees VALUES (274, N'Stephen', N'Jiang', N'North American Sales Manager',3,273)
INSERT INTO dbo.MyEmployees VALUES (275, N'Michael', N'Blythe', N'Sales Representative',3,274)
INSERT INTO dbo.MyEmployees VALUES (276, N'Linda', N'Mitchell', N'Sales Representative',3,274)
INSERT INTO dbo.MyEmployees VALUES (285, N'Syed', N'Abbas', N'Pacific Sales Manager',3,273)
INSERT INTO dbo.MyEmployees VALUES (286, N'Lynn', N'Tsoflias', N'Sales Representative',3,285)
INSERT INTO dbo.MyEmployees VALUES (16, N'David',N'Bradley', N'Marketing Manager', 4, 273)
INSERT INTO dbo.MyEmployees VALUES (23, N'Mary', N'Gibson', N'Marketing Specialist', 4, 16)
SELECT * FROM MyEmployees


WITH DirectReports (ManagerID, EmployeeID, Title, Level)
AS
(
SELECT e.ManagerID, e.EmployeeID, e.Title,
0 AS Level
FROM dbo.MyEmployees AS e
WHERE e.ManagerID IS NULL
UNION ALL
SELECT e.ManagerID, e.EmployeeID, e.Title,
Level + 1
FROM dbo.MyEmployees AS e
INNER JOIN DirectReports AS d
ON e.ManagerID = d.EmployeeID)
-- Statement that executes the CTE
SELECT ManagerID, EmployeeID, Title, Level
FROM DirectReports ;

No comments:

Post a Comment