根据您编写查询的方式,您最好限制递归级别数。如果限制级别数,您可以只返回顶级管理人员(举例来说),但是,如果命令链比您的预期要长,则可能会排除一些雇员。如果不对级别数加以限制,则可确保不会排除任何雇员,但是,如果执行需要任何循环,则可能会引入无限递归。例如,如果某雇员直接或间接地向他自己报告。公司的管理层次中也可能会发生这种情况,例如,公司的某名雇员同时也是董事会成员。
以下查询说明了如何按管理级别列出雇员。级别 0 表示没有经理的雇员。级别 1 表示直接向某一位级别 0 的经理报告的雇员,级别 2 表示直接向级别 1 的经理报告的雇员,依此类推。
WITH RECURSIVE manager ( EmployeeID, ManagerID, GivenName, Surname, mgmt_level ) AS ( ( SELECT EmployeeID, ManagerID, -- initial subquery GivenName, Surname, 0 FROM Employees AS e WHERE ManagerID = EmployeeID ) UNION ALL ( SELECT e.EmployeeID, e.ManagerID, -- recursive subquery e.GivenName, e.Surname, m.mgmt_level + 1 FROM Employees AS e JOIN manager AS m ON e.ManagerID = m.EmployeeID AND e.ManagerID <> e.EmployeeID AND m.mgmt_level < 20 ) ) SELECT * FROM manager ORDER BY mgmt_level, Surname, GivenName; |
递归查询中将管理级别限制为低于 20 的条件是一项重要的预防措施。它可以防止在表数据包含循环时出现无限递归。
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |