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 添加到最外层的查询以获取该值。
我在 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 添加到最外层的查询以获取该值。