实施例的表结构:SQL:优化递归CTE
EmployeeId TeamleaderId TopTeamleaderId LEVEL ParentTree CompanyId
1 0 0 0 NULL 1
2 1 1 1 2>1 1
3 2 1 2 3>2>1 1
TeamleaderId
是foreignKey
参照EmployeeId
在同一表
目标: 每当行被插入在表中与EmployeeId
,TeamleaderId
,CompanyId
自动填充TopTeamleaderId
,LEVEL
和ParentTree
与AFTER INSERT
触发
代码:
WITH CTE AS (
SELECT EmployeeId, TeamleaderId,0 AS [Level], CAST(EmployeeId AS varchar(100)) AS Heirarchy, TopTeamleaderId
FROM dbo.Employee
WHERE EmployeeId IN (SELECT EmployeeId FROM Employee WHERE TeamleaderId IS NULL
AND CompanyId IN(SELECT DISTINCT CompanyId FROM INSERTED))
UNION ALL
SELECT mgr.EmployeeId, mgr.TeamleaderId, CTE.[Level] +1 AS [Level],
CAST((CAST(mgr.EmployeeId AS VARCHAR(100)) + '>' + CTE.Heirarchy) AS varchar(100)) AS Heirarchy, CTE.TopTeamleaderId
FROM CTE
INNER JOIN dbo.Employee AS mgr
ON TaskCTE.EmployeeId = mgr.ParentTeamleaderId
)
UPDATE Employee SET [LEVEL] = TC.[LEVEL], ParentTree = TC.Heirarchy, TopTeamleaderId = TC.TopTeamleaderId
FROM dbo.Employee AS Employee
JOIN (SELECT * FROM CTE WHERE EmployeeId IN(SELECT DISTINCT EmployeeId FROM INSERTED) AND ParentTeamleaderId IS NOT NULL) TC
ON
Employee.EmployeeId = TC.EmployeeId
问题: 想象有像百万员工在一个公司,这个查询需要很长的时间来执行。如何优化它,以便只有插入行的父母才会被记录下来?
什么是你的楼内设有商务规则来做到这一点?请解释并举个例子。 –
看到规则不明确,也没有你的餐桌设计的目的。下脚本是好的,但在你的脚本之上,即使从递归CTE的角度来看也是错误的。它也可以被优化。 – KumarHarsh