公用表表达式可以是递归的。当 RECURSIVE 关键字紧跟在 WITH 后面出现时,公用表表达式是递归的。一个 WITH 子句可以包含多个递归表达式,并且可以同时包含递归公用表表达式和非递归公用表表达式。
递归公用表表达式提供了一种方便的方法来编写将关系返回到任意深度的查询。例如,给定一个呈现公司内的隶属关系的表,您可以很容易地编写一个查询,让它返回所有隶属于某特定人员的雇员。
根据您编写查询的方式,您可以限制递归级别数,也可以不加限制。如果限制级别数,您可以只返回顶级管理人员(举例来说),但是,如果命令链比您的预期要长,则可能会排除一些雇员。如果不对级别数加以限制,则可确保不会排除任何雇员,但是,如果图形包含任何循环,则可能会引入无限递归。例如,如果某雇员直接或间接地向他自己报告。公司的管理层次结构中也可能会发生这种情况,例如,公司的某名雇员也是董事会成员。
递归提供了更加容易的方法来遍历呈现树状或类似树状的数据结构的表。在不使用递归表达式的情况下使用一个语句遍历这种结构的唯一方法是针对每个可能的级别让表与它自身连接一次。例如,如果报告层次最多包含七个级别,您必须将雇员表与它自身连接七次。如果公司进行重组并且引入了一个新的管理级别,您必须重写查询。
递归公用表表达式包含一个初始子查询(也就是种子)以及一个在每次迭代期间给结果集追加其它行的递归子查询。连接这两个部分只能使用运算符 UNION ALL。初始子查询是普通的非递归查询,首先得到处理。递归部分包含对上一次迭代期间添加的行的引用。只要迭代不生成新行,递归就会自动停止。对于在上一次迭代之前选择的行,无法引用。
递归子查询的选择列表必须在编号和数据类型方面都与初始子查询的选择列表匹配。如果无法执行数据类型的自动转换,可显式转换一个子查询的结果,以便它们与其它子查询的结果匹配。
有关公用表表达式的详细信息,请参见关于公用表表达式。
SQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。