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

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

 2009-02-03 10:21:26 来源:WEB开发网   
核心提示:先看如下一个数据表(t_tree):上图显示了一个表中的数据,这个表有三个字段:id、node_name、parent_id,SQL Server2005杂谈(2):公用表表达式(CTE)的递归调用,实际上,这个表中保存了一个树型结构,如下图所示,从上面可以看出,分三层:省、市、区,其中id表示当前省、市或区的id号、

先看如下一个数据表(t_tree):

上图显示了一个表中的数据,这个表有三个字段:id、node_name、parent_id。实际上,这个表中保存了一个树型结构,分三层:省、市、区。其中id表示当前省、市或区的id号、node_name表示名称、parent_id表示节点的父节点的id。

现在有一个需求,要查询出某个省下面的所有市和区(查询结果包含省)。如果只使用SQL语句来实现,需要使用到游标、临时表等技术。但在SQL Server2005中还可以使用CTE来实现。

从这个需求来看属于递归调用,也就是说先查出满足调价的省的记录,在本例子中的要查“辽宁省”的记录,如下:

id  node_name  parent_id

1   辽宁省    0

然后再查所有parent_id字段值为1的记录,如下:

id  node_name  parent_id

2   沈阳市    1

3   大连市    1

最后再查parent_id字段值为2或3的记录,如下:

id  node_name  parent_id

4    大东区    2

5    沈河区    2

6    铁西区    2

将上面三个结果集合并起来就是最终结果集。

上述的查询过程也可以按递归的过程进行理解,即先查指定的省的记录(辽宁省),得到这条记录后,就有了相应的id值,然后就进入了的递归过程,如下图所示。

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

从上面可以看出,递归的过程就是使用union all合并查询结果集的过程,也就是相当于下面的递归公式:

  resultset(n) = resultset(n-1)union allcurrent_resultset

1 2 3  下一页

Tags:SQL Server 杂谈

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