假设我有下表:
CREATE TABLE Employees
(
EmployeeId int PRIMARY KEY NOT NULL,
ParentEmployeId int REFERENCES Employees(EmployeeId) NULL,
Name varChar(255)
)
所有记录都有一个主标识符,记录能够将另一个记录标识为父记录。
(我的实际模式不是关于员工的,这只是一个简单的说明版本,因此如果您有更好的方法来处理员工信息,它与此对话没有关系。)
插入以下记录:
INSERT INTO Employees VALUES (1, NULL, 'Company President 1')
INSERT INTO Employees VALUES (2, NULL, 'Company President 2')
INSERT INTO Employees VALUES (3, 1, 'Company President 1 - VP')
INSERT INTO Employees VALUES (4, 2, 'Company President 2 - VP')
INSERT INTO Employees VALUES (5, 3, 'Company President 1 - VP - Secretary')
INSERT INTO Employees VALUES (6, 4, 'Company President 2 - VP - Secretary')
INSERT INTO Employees VALUES (7, 5, 'Company President 1 - VP - Secretary - Sandwich Delivery')
这些插入表示:
Company President 1
Company President 1 - VP
Company President 1 - VP - Secretary
Company President 1 - VP - Secretary - Sandwich Delivery
Company President 2
Company President 2 - VP
Company President 2 - VP - Secretary
我要做的是为所有有空值的员工
ParentEmployeeId
我想找到链中的最后一个人,在本例中是“
Company President 1 - VP - Secretary - Sandwich Delivery
“和”
Company President 2 - VP - Secretary
".
我有以下的CTE,它给了我一切,包括嵌套水平,但我不知道从这里去哪里。如果可能的话,我想避免使用光标。
还有,这是
非常重要
,我在其他地方有逻辑,保证一个员工只能有一个直接下属。所以尽管模式在技术上允许它,
Company President 1
不会有两个副总裁。
WITH EmployeeRec(EmployeeId, ParentEmployeeId, Name, Level) AS
(
SELECT
EmployeeId,
ParentEmployeId,
Name,
1 as [Level]
FROM
Employees
WHERE
ParentEmployeId IS NULL
UNION ALL
SELECT
E.EmployeeId,
E.ParentEmployeId,
E.Name,
R.[Level] + 1
FROM
Employees E
INNER JOIN
EmployeeRec R
ON
E.ParentEmployeId = R.EmployeeId
)
SELECT * FROM EmployeeRec