Sql递归(用with 实现)-Natsume Takashi
Access软件网QQ交流学习群(群号码198465573),欢迎您的加入!
首页 >技术文章> ADP及SQL SERVER


Sql递归(用with 实现)

发表时间:2018/2/26 12:47:27 评论(0) 浏览(6163)  评论 | 加入收藏 | 复制
   
摘 要:Sql递归(用with 实现)
正 文:

1.递归原理(摘自网上) 

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

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

Sql递归的优点:效率高,大量数据集下,速度比程序的查询快。

2.递归例子(摘自网上) 

CTE_query_definition:
指定一个其结果集填充公用表表达式的 Select 语句。除了 CTE 不能定义另一个 CTE 以外,CTE_query_definition的 Select 语句必须满足与创建视图时相同的要求。
如果定义了多个 CTE_query_definition,则这些查询定义必须用下列一个集合运算符联接起来:UNION ALL、UNION、EXCEPT 或 INTERSECT。


--开始实例演示--


先创建一个仓库表,表名为Storage_Depository,该表有三个字段:DID(仓库编号),DName(仓库名称),PID(父仓库编号).
通过这样一个简单表,就可以将所有仓库信息,通过DID与PID字段来创建一个树型结构。
创建表的sql语句:


Create table Storage_Depository
(
DID varchar(50) not null primary key,
DName varchar(50) not null,
PID varchar(50) null
)
然后往该表插入演示数据:


insert into Storage_Depository(DID,DName,PID) 
select 'A','A仓库',null 
union all
select 'A-1','A-1仓库','A' 
union all
select 'A-2','A-2仓库','A' 
union all
select 'A-1-1','A-1-1仓库','A-1' 
union all
select 'B','B仓库',null 
从上面的数据可以看的出来,A的子仓为A-1与A-2仓,而A-1-1为A-1的子仓,B仓是一个独立的仓库,与A仓平级。
下面,我们通过with as功能,查出A仓下面的所有子仓:


with w_Storage_Depository as
(
select DID,DName,PID from Storage_Depository where DID='A'
union all
select A.DID,A.DName,A.PID from Storage_Depository A,w_Storage_Depository B where A.PID=B.DID
)
select * from w_Storage_Depository
代码很简短,也非常容易让人理解.


反过来,比如我们要查出A-1-1仓的所有上级仓,稍稍改一下上面的sql语句就可以了:


with w_Storage_Depository as
(
select DID,DName,PID from Storage_Depository where DID='A-1-1'
union all
select A.DID,A.DName,A.PID from Storage_Depository A,
w_Storage_Depository B where A.DID=B.PID
)
select * from w_Storage_Depository


Access软件网交流QQ群(群号:198465573)
 
 相关文章
【SQL SERVER小品】跟踪追击--SQL SERVER递归查...  【煮江品茶  2015/4/30】
【Access小品】越俎代庖--递归函数示例,Access树控件制...  【煮江品茶  2015/6/4】
【SQL SERVER小品】内在联系与外在表现--解答对递归查询的...  【煮江品茶  2015/7/22】
用VB递归算法实现BOM展开的树型结构操作  【梁志强,谢菁  2017/4/14】
SQL 递归查询  【缪炜  2017/7/30】
常见问答
技术分类
相关资源
文章搜索
关于作者

Natsume Takashi

文章分类

文章存档

友情链接