- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
HYPERLINK /keepfool/archive/2012/02/05/2338700.html sql 函数实现三种父子递归
2012-02-05 00:31 by keepfool, 1164 visits, HYPERLINK /keepfool/archive/2012/02/05/2338700.html 收藏, HYPERLINK /keepfool/admin/EditPosts.aspx?postid=2338700 编辑
在实际运用中经常会创建这样的结构表Category(Id, ParentId, Name),特别是用于树形结构时(菜单树,权限树..),这种表设计自然而然地会用到递归,若是在程序中进行递归(虽然在程序中递归真的更方便一些),无论是通过ADO.NET简单sql查找还是ORM属性关联都会执行多次sql语句,难免会造成一些性能上的损耗,所以干脆使用sql的函数来解决这个问题,用函数返回我们最终需要的结果。
针对这类需求,这里我列出三种常用的递归:
以一个节点为基点,列出所有子节点直到无子 (找下级) 。这有点儿像点兵点将,主帅只有一个,下面是左将、右将,左将下面又有千夫长、百夫长,点兵时主帅下令集合,下面的将军只管各自的队伍。
以一个节点为基点,列出所有父节点直到祖先(找上级) 。
面包屑导航数据(单条数据)
下面我以一幅图列出这三种形式(实线表现的是我们最终想要的数据,第三幅图中只有一条数据):
OK,现在让我们来实现这几个需求,step by step。
1. 数据准备
根据上面的图中的数据创建表结构和测试数据
create table Region
(
Id int identity primary key,
Name nvarchar(20),
ParentId int
)
go
insert into Region(Name,ParentId) values(广东,NULL)
insert into Region(Name,ParentId) values(深圳,1)
insert into Region(Name,ParentId) values(惠州,1)
insert into Region(Name,ParentId) values(罗湖区,2)
insert into Region(Name,ParentId) values(福田区,2)
insert into Region(Name,ParentId) values(龙岗区,2)
insert into Region(Name,ParentId) values(惠阳区,3)
insert into Region(Name,ParentId) values(龙门县,3)
insert into Region(Name,ParentId) values(华强北,5)
insert into Region(Name,ParentId) values(体育馆,5)
select * from Region
2. 正向递归实现
/*
* summary:递归获取所有子节点
*/
alter function GetRecursiveChildren
(
@Id int
)
returns @t table(Id int,ParentId int,Name nvarchar(20), [Level] int)
begin
declare @i int
set @i = 1
--根节点,Level = 0
insert into @t select @Id,@id,(select Name from Region where Id = @id),0
--直属子节点,Level = 1
insert into @t select Id,ParentId,Name,@i from Region where ParentId = @Id
--如果没有新的值插入,循环结束
while @@rowcount0
begin
set @i = @i + 1;
insert into @t
select
a.Id,a.ParentId,a.Name,@i
from
Region a, @t b
where
a.ParentId = b.Id and b.Level = @i - 1
end
return
end
go
--调用函数
select * from GetRecursive
您可能关注的文档
- B题菏泽学院裴国栋,王崇吉,赵鹏翔.doc
- C.Jhn-Langley供应链管理-ch09.ppt
- C++程序设计【实验】教案.doc
- BX-ZY-81-LG55光片盒和扶栏组装作业指导书.pdf
- CAA之添加工具条.pdf
- CAD定数等分和旋转偏移练习.docx
- 高年级古诗词诵读文档-(2).doc
- CABLED亮脉Sales-Kit-(20-Sept-11)-Sim-ChiWF.pdf
- CAD命令大全-不看后悔.doc
- CAD-通信工程图.ppt
- STL真崛起了嘛?浅谈对各门派看法.pdf
- steelcase办公家具公司-行业趋势杂志.pdf
- SU-BN10008人1-3-β-D葡聚糖(1,3-β-DG).pdf
- SVPWM(软件法)程序.doc
- SX6116-收音IC-datasheet.pdf
- SWU901壁挂外夹式超声波流量计.pdf
- SY89829UHY;SY89829UHY-TR;SY89829UHI;中文规格书,Datasheet资料.pdf
- System-Center-2012-Cnfiguratins-Manager-安装手册.docx
- S版语文二年级上册第27课《冬爷爷图画》课件1.ppt
- T20-T70-镜头抖动维修资料.pdf
文档评论(0)