现在有一个需求,要查询出某个省下面的所有市和区(查询结果包含省)。如果只使用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值,然后就进入了的递归过程,如下图所示。
从上面可以看出,递归的过程就是使用union all合并查询结果集的过程,也就是相当于下面的递归公式:
resultset(n) = resultset(n-1) union all current_resultset
其中resultset(n)表示最终的结果集,resultset(n – 1)表示倒数第二个结果集,current_resultset表示当前查出来的结果集,而最开始查询出“辽宁省”的记录集相当于递归的初始条件。而递归的结束条件是current_resultset为空。下面是这个递归过程的伪代码:
public resultset getResultSet(resultset)
{
if(resultset is null)
{
current_resultset =第一个结果集(包含省的记录集)
将结果集的id保存在集合中
getResultSet(current_resultset)
}
current_resultset = 根据id集合中的id值查出当前结果集
if(current_result is null) return resultset
将当前结果集的id保存在集合中
return getResultSet(resultset union all current_resultset)
}// 获得最终结果集
resultset = getResultSet(null)
从上面的过程可以看出,这一递归过程实现起来比较复杂,然而CTE为我们提供了简单的语法来简化这一过程。
实现递归的CTE语法如下:










