Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.0 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询和修改数据 » 公用表表达式 » 递归公用表表达式

 

选择分层数据

根据您编写查询的方式,您最好限制递归级别数。如果限制级别数,您可以只返回顶级管理人员(举例来说),但是,如果命令链比您的预期要长,则可能会排除一些雇员。如果不对级别数加以限制,则可确保不会排除任何雇员,但是,如果执行需要任何循环,则可能会引入无限递归。例如,如果某雇员直接或间接地向他自己报告。公司的管理层次中也可能会发生这种情况,例如,公司的某名雇员同时也是董事会成员。

以下查询说明了如何按管理级别列出雇员。级别 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 选项