【SQL SERVER小品】跟踪追击--SQL SERVER递归查询示例-煮江品茶
Access软件网QQ交流学习群(群号码198465573),欢迎您的加入!
首页 >技术文章> 源码示例


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

发表时间:2015/4/30 11:36:40 评论(1) 浏览(13009)  评论 | 加入收藏 | 复制
   
摘 要:【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群(群号:198465573)
 
 相关文章
跟踪和查看 SharePoint 列表项的版本信息  【Microsoft  2008/8/12】
[窗体] 生产跟踪查询加tree菜单分享  【yori2007  2009/2/27】
鞋底入库跟踪系统含源码  【goto2008   2010/1/23】
【access小品】华山论剑--场内货币交易跟踪解法之争  【todaynew  2010/7/24】
【招标采购】Access中标单位跟踪评价评测评分程序;Access...  【风行   2012/1/7】
【access小品】蜻蜓咬尾---多端点配线路径递归计算示例  【煮江品茶  2012/2/26】
【Access函数】列表文件递归  【亚伦·布朗  2012/8/30】
常见问答
技术分类
相关资源
文章搜索
关于作者

煮江品茶

文章分类

文章存档

友情链接