SQL Server2005杂谈(2):公用表表达式(CTE)的递归调用
2009-02-03 10:21:26 来源:WEB开发网其中resultset(n)表示最终的结果集,resultset(n - 1)表示倒数第二个结果集,current_resultset表示当前查出来的结果集,而最开始查询出“辽宁省”的记录集相当于递归的初始条件。而递归的结束条件是current_resultset为空。下面是这个递归过程的伪代码:
publicresultsetgetResultSet(resultset)
{
if(resultsetisnull)
{
current_resultset=第一个结果集(包含省的记录集)
将结果集的id保存在集合中
getResultSet(current_resultset)
}
current_resultset=根据id集合中的id值查出当前结果集
if(current_resultisnull)returnresultset
将当前结果集的id保存在集合中
return getResultSet(resultsetunionallcurrent_resultset)
}
//获得最终结果集
resultset=getResultSet(null)
从上面的过程可以看出,这一递归过程实现起来比较复杂,然而CTE为我们提供了简单的语法来简化这一过程。
实现递归的CTE语法如下:
[WITH<common_table_expression>[,n]]
<common_table_expression>::=
expression_name[(column_name[,n])]
AS(
CTE_query_definition1 -- 定位点成员(也就是初始值或第一个结果集)
unionall
CTE_query_definition2 -- 递归成员
)
下面是使用递归CTE来获得“辽宁省”及下面所有市、区的信息的SQL语句:
with
districtas
(
-- 获得第一个结果集,并更新最终结果集
select*fromt_treewherenode_name=N'辽宁省'
unionall
-- 下面的select语句首先会根据从上一个查询结果集中获得的id值来查询parent_id
-- 字段的值,然后district就会变当前的查询结果集,并继续执行下面的select语句
-- 如果结果集不为null,则与最终的查询结果合并,同时用合并的结果更新最终的查
-- 询结果;否则停止执行。最后district的结果集就是最终结果集。
selecta.*fromt_treea,districtb
wherea.parent_id=b.id
)
select*fromdistrict
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接