SQL 服务器:查找层级链断裂的位置

SQL Server : finding where the chain of hierarchy broke

我在 table 中有超过 70k 的员工数据。它看起来像这样:

+----------------+----------------------+----------+
| EmployeeId     | name                 | ManagerID|
+----------------+----------------------+----------+
|              1 | Iron Man             | 2        |
|              2 | Batman               | 4        |
|              3 | Superman             | 2000     |
|              4 | Captain America      | 3        |    
+----------------+----------------------+----------+

在这里,超人有一个无效的 ManagerID,因为 ManagerID = 2000 不存在于 EmployeeID 列中。为了给超人分配一个新的 ManagerID,我需要找出他位于哪个层级。我知道这应该是一些递归查询,但我遇到了很多困难。有人可以帮忙吗?非常感谢!

为了找出损坏的记录,您可以使用 子查询 :

select * 
from table t
where not exists (select 1 from table where EmployeeId = t.ManagerID);

这可能会帮助您入门。

CREATE TABLE Employees ( EmployeeID INT, Name VARCHAR(200), ManagerID INT )
INSERT INTO Employees ( EmployeeID, Name, ManagerID ) VALUES ( 1, 'Iron Man', 2 ), ( 2, 'Batman', 4 ), ( 3, 'Superman', 2000 ), (4, 'Captain America', 3 )

WITH Relationships ( ManagerID, Name, EmployeeID ) AS
(
  SELECT
    ManagerID, Name, EmployeeID
  FROM
    Employees
  WHERE
    ManagerID IN ( SELECT EmployeeID FROM Employees )
  UNION ALL
  SELECT
    Employees.ManagerID, Relationships.Name, Relationships.EmployeeID
  FROM
    Employees,
    relationships
  WHERE
    Employees.EmployeeID = Relationships.ManagerID
)
SELECT
  EmployeeID, Name, ManagerID
FROM
  Relationships
WHERE
  EmployeeID = 1 -- Iron Man
OPTION ( MAXRECURSION 25000 )

将 "EmployeeID = 1" 替换为您要定位的任何员工 ID。它的行数returns就是等级。您可以将 ROW_NUM 添加到最外层的查询以获取该值。