Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > 源码示例

【SQL SERVER小品】跟踪追击--SQL SERVER递归查询示例

时 间:2015-04-30 11:36:40
作 者:煮江品茶   ID:10802  城市:武汉
摘 要:【SQL SERVER小品】跟踪追击 -- SQL SERVER递归查询示例
正 文:

  递归,是遍历具有层次结构数据的一种算法,各种程序语言中均具有递归运算的方法,在SQL SERVER和ORACLE中也具有递归查询的能力。不过,在SQL SERVER中递归查询的写法有点怪异。

  比如,在单据数据库中有一个单据表,这个数据表用来存储单据的信息。其中包含单据ID、单据编号、父单ID等多个字段。单据之间存在的单据链,由单据ID、父单ID这两个字段来表达,也就是通过这两个字段形成单据之间的层次关系。依据这个数据表,我们可以写一个递归查询,来更明确的表示单据之间的关系。我们可以这样来写:



USE 单据数据库;
GO


WITH 单据递归查询(单据ID,单据编号,父单ID,根单据,level)
AS( /*根记录*/
  Select 单据ID,单据编号,父单ID,单据ID AS 根单据,0 AS level
  FROM 单据表 Where ISNULL(父单ID,0)=0
  /*递归运算*/
  UNION ALL
  Select a.单据ID,a.单据编号,a.父单ID,b.根单据,level+1
  FROM 单据表 AS a,单据递归查询 AS b
  Where a.父单ID=b.单据ID
)
Select * FROM 单据递归查询 orDER BY 根单据,level;


  WITH子句后面是递归查询的名称(可以随意取),然后是递归查询需要返回的字段列表。其中level是节点的等级,这个等级在根记录上应该设置为0,递归运算时逐步加1。level的取值方法,在AS子句中不难看出。根单据这个字段,不是必要的。但设计这个字段,有利于对记录的分组,也就是可以通过排序容易的找到同一个根单据下的所有各层级子单据。

  AS子句用于构成递归查询的主体语句,它看起来是一个联合查询。其中第一个Select查询出所有的根记录。然后通过UNION配合第二个Select进行递归运算,并联合起来。联合的条件存在于Where子句中。需要注意的是SQL SERVER递归的层次最多100层,超过这个限制将会跳错。

  最后的一个Select子句是用来返回结果集的。整个语法有点像创建一个单语句表值函数,由WITH创建一个临时表变量,由AS给表变量追加记录,然后由最后的Select返回这个表变量的结果集。


  当然,我们也可以持久性的保存这样的递归查询,方法是将递归查询创建为视图。下面是我们用单据数据库中的BOM表创建一个递归视图的示例:
 



Access软件网官方交流QQ群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助