根据您编写查询的方式,您最好限制递归级别数。如果限制级别数,您可以只返回顶级管理人员(举例来说),但是,如果命令链比您的预期要长,则可能会排除一些雇员。如果不对级别数加以限制,则可确保不会排除任何雇员,但是,如果执行需要任何循环,则可能会引入无限递归。例如,如果某雇员直接或间接地向他自己报告。公司的管理层次中也可能会发生这种情况,例如,公司的某名雇员同时也是董事会成员。
以下查询说明了如何按管理级别列出雇员。级别 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 的条件是一项重要的预防措施。它可以防止在表数据包含循环时出现无限递归。
max_recursive_iterations 选项旨在捕获失控的递归查询。此选项的缺省值是 100。超过此递归级别数的递归查询会结束,但是会导致出现错误。
虽然此选项似乎可以降低停止条件的重要性,但是通常并不是这样。在每次迭代期间选择的行数可能会以指数方式增加,在达到最大值之前就会严重影响数据库性能。递归查询中的停止条件提供了为每种情况设置适当限制的方法。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |