SqlServerl递归的一种实现——with as

项目中经常回遇到表结构存在级联关系的数据结构,如公司的组织架构等。下面是一张常见的表结构:
<code>
create table U_Department
(
DepId int identity(1,1) primary key,
DepName varchar(200) null,
DepPid int null,
DepRemark varchar(500) null
)
</code>
通过<code>with</code>语句可以获得某个<code>DepId</code>下的所有下级部门,以存储过程的形式实现:
<code>
create procedure P_GetChildrenOfDepartment(@DepId int)
as
begin
with Dep as
(
select DepId,DepPid
from U_Department
where DepPid=@DepId
union all
select DepId,DepPid
from U_Department d inner join Dep p on d.DepPid=p.DepId
)
select DepId from Dep
end
</code>
同理,获得某个部门的所有父节点,只需要修改一下<code>where</code>条件和内连接的<code>on</code>条件即可:
<code>
create procedure P_GetParentOfDepartment(@DepId int)
as
begin
with Dep as
(
select DepId,DepPid
from U_Department
where DepId=@DepPid
union all
select DepId,DepPid
from U_Department d inner join Dep p on d.DepId=p.DepPid
)
select DepId from Dep
end
</code>
当然,很多其他的方式也可以实现相同的功能,如:游标,表变量等,相比之下,<code>with</code>语句要简洁方便的多。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • 什么是SQL数据库: SQL是Structured Query Language(结构化查询语言)的缩写。SQL是...
    西贝巴巴阅读 1,855评论 0 10
  • 自选择了工商管理系已经有一年的时间了,在这一年的时间里,我一直在摸索着我的的专业,从一开始的成绩至上,我渐渐地摸...
    冬季有暖阳阅读 487评论 7 10
  • 这是我们相遇后的第62篇文章 文 | 虢雪生 图片/ 网络 编辑/ 虢雪生 絮叨部分 现实世界里,没有武侠。 连...
    子木蠡阅读 1,440评论 2 14
  • 清晨,散步,出毛遂公园,小雨稀稀拉拉下着,急一阵,慢一阵,淋在身上点点嘀嘀,潮潮的,凉凉的。 抬头看天气,阴阴的,...
    陈幸革阅读 517评论 1 5