下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

SQL SERVER 进行递归查询

作者:课课家教育     来源: http://www.kokojia.com点击数:1669发布时间: 2019-03-01 10:33:55

标签: 数据库SQL SERVER递归查询

  在工作当中会经常用到递归,比如菜单的展示。一种方法就是从数据库中取出所有的数据,然后在程序中循环获取符合条件的数据。另外一种方法就是使用SQL直接读取符合条件的数据。从SQLServer2005开始,我们可以直接通过CTE来支持递归查询,这对查询树形或层次结构的数据很有用。CTE即公用表表达式,虽然不恰当,但你可以将它看做成一个临时命名的结果集合。

  一、递归查询至少包含两个子查询:

  第一个子查询称作定点(Anchor)子查询:定点查询只是一个返回有效表的查询,用于设置递归的初始值;

  第二个子查询称作递归子查询:该子查询调用CTE名称,触发递归查询,实际上是递归子查询调用递归子查询;

  两个子查询使用unionall,求并集;

  二、CTE的递归终止条件

  递归查询没有显式的递归终止条件,只有当递归子查询返回空结果集(没有数据行返回)或是超出了递归次数的最大限制时,才停止递归。

  默认的递归查询次数是100,可以使用查询提示(hint):MAXRECURSION控制递归的最大次数:OPTION(MAXRECURSION16);如果允许无限制的递归次数,使用查询提示:option(maxrecursion0);当递归查询达到指定或默认的MAXRECURSION数量限制时,SQLServer将结束查询并返回错误,如下:

  Thestatementterminated.Themaximumrecursion10hasbeenexhaustedbeforestatementcompletion.

  事务执行失败,该事务包含的所有操作都被回滚。在产品环境中,慎用maxrecursion查询提示,推荐通过where条件限制递归的次数。

  三、递归步骤

  step1:定点子查询设置CTE的初始值,即CTE的初始值Set0;

  递归调用的子查询过程:递归子查询调用递归子查询;

  step2:递归子查询第一次调用CTE名称,CTE名称是指CTE的初始值Set0,第一次执行递归子查询之后,CTE名称是指结果集Set1;

  step3:递归子查询第二次调用CTE名称,CTE名称是指Set1,第二次执行递归子查询之后,CTE名称是指结果集Set2;

  step4:在第N次执行递归子查询时,CTE名称是指Set(N-1),递归子查询都引用前一个递归子查询的结果集;

  Step5:如果递归子查询返回空数据行,或超出递归次数的最大限制,停止递归;

  一般的树形表结构如下,相信大家都很熟悉的

  下面上代码

 下面上代码

  递归原理

  递归CTE最少包含两个查询(也被称为成员)。第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点。第二个查询被称为递归成员,使该查询称为递归成员的是对CTE名称的递归引用是触发。在逻辑上可以将CTE名称的内部应用理解为前一个查询的结果集。

  递归查询没有显式的递归终止条件,只有当第二个递归查询返回空结果集或是超出了递归次数的最大限制时才停止递归。是指递归次数上限的方法是使用MAXRECURION。

  Sql递归的优点:

  效率高,大量数据集下,速度比程序的查询快。

  小编结语:

  更多内容尽在课课家教育!

赞(28)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程