频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

SQL Server 2005 Beta 2 Transact-SQL 增强功能 1

来源:互连网 作者: 出处:巧巧读书 2006-02-24 进入讨论组
上一页 1 2 3 4 5 6 7 8 9 10 11 下一页 

递归查询

非递归 CTE 改善了您的表达能力。但是对于每一段使用非递归 CTE 的代码,您通常可以通过使用其他 Transact-SQL 结构(例如,派生表)来编写能够获得相同结果的较短的代码。对于递归 CTE,情况是不同的。

本节描述递归查询的语义,并且为组织结构图中雇员的层次结构以及材料清单 (BOM) 方案提供了实际实现。

语义

当 CTE 引用它本身时,它被视为递归的。递归的 CTE 是根据至少两个查询(或者,用递归查询的说法,为成员)构建的。一个是非递归查询,也称为锚定成员 (AM)。另一个是递归查询,也称为递归成员 (RM)。查询由 UNION ALL 运算符分隔。以下示例显示了递归 CTE 的简化的一般形式:

WITH RecursiveCTE()
AS
(
-- Anchor Member:
-- SELECT query that does not refer to RecursiveCTE
SELECT ...
FROM
...
UNION ALL
-- Recursive Member
-- SELECT query that refers to RecursiveCTE
SELECT ...
FROM
JOIN RecursiveCTE
...
)
-- Outer Query
SELECT ...
FROM RecursiveCTE
...

在逻辑上,您可以将实现递归 CTE 的算法视为:

1.

锚定成员被激活。集 R0(R 表示“结果”)被生成。

2.

递归成员被激活,在引用 RecursiveCTE 时获得集 Rii = 步骤号)作为输入。集 Ri + 1 被生成。

3.

步骤 2 的逻辑被反复运行(在每个迭代中递增步骤号),直到返回空集。

4.

外部查询执行,在引用 RecursiveCTE 时,获得以前所有步骤的累积 (UNION ALL) 结果。

可以在 CTE 中具有两个以上的成员,但是在递归成员和另一个成员(递归或非递归)之间只能有一个 UNION ALL 运算符。其他运算符(例如,UNION)只能在非递归成员之间使用。与支持隐式转换的常规 UNION 和 UNION ALL 运算符不同,递归 CTE 要求所有成员中的列完全匹配,包括具有相同的数据类型、长度和精度。

在递归 CTE 和传统的递归例程(未必特定于 SQL Server)之间存在相似性。递归例程通常包括三个重要元素 — 该例程的第一个调用、递归终止检查以及对同一例程的递归调用。递归 CTE 中的锚定成员对应于传统递归例程中该例程的第一个调用。递归成员对应于该例程的递归调用。终止检查在递归例程中通常是显式的(例如,借助于 IF 语句),但在递归 CTE 中是隐式的 — 当没有从上一个调用中返回任何行时,递归停止。

URL:http://www.qqread.com/sqlserver/f062384005.html 更多文章 更多内容请看SQL Server 数据处理专题SQL Server 索引和查询专题SQL Server专题,或进入讨论组讨论。
上一页 1 2 3 4 5 6 7 8 9 10 11 下一页 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章