WEB开发网
开发学院数据库MSSQL Server SQL Server2005杂谈(2):公用表表达式(CTE)的... 阅读

SQL Server2005杂谈(2):公用表表达式(CTE)的递归调用

 2009-02-03 10:21:26 来源:WEB开发网   
核心提示: 其中resultset(n)表示最终的结果集,resultset(n - 1)表示倒数第二个结果集,SQL Server2005杂谈(2):公用表表达式(CTE)的递归调用(2),current_resultset表示当前查出来的结果集,而最开始查询出“辽宁省”的记

其中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

Tags:SQL Server 杂谈

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接