Design1:数据层次结构建模之一
在现实世界中,有很多现象存在层次结构,比如,公司的人事职称是典型的层次结果,如下图
SQL Server是关系型DB,适合存储二维关系的数据,如何存储具有层次结构的数据了?需要使用一个字段ParentID表示上级ID,示例表结构如下
create table dbo.emph ( ID int not null primary key, ParentID int foreign key references dbo.emph(id), Descr varchar(100) not null )
插入示例数据
insert into dbo.emph(id,ParentID,Descr) values(1,null,'boss'), (2,1,'M1'),(3,1,'M2'),(4,1,'M3'),(5,1,'M4'), (6,2,'L11'),(20,2,'L12'),(7,2,'L13'),(8,2,'L14'),(9,2,'L15'), (10,3,'L21'),(11,3,'L22'),(12,3,'L23'),(14,3,'L24'), (15,6,'E111'),(16,6,'E112'),(17,6,'E113'),(18,6,'E114'), (19,20,'E121'),(21,20,'E122'),(22,20,'E123')
一,递归查询
使用CTE递归查询M1手下的所有员工,包括Leader和Employee
;with cte(id,parentid,descr) as ( select id,parentid,descr from dbo.emph where id=2 union all select e.ID,e.ParentID,e.Descr from dbo.emph e inner join cte c on e.ParentID=c.id ) select * from cte order by parentid
二,查看查询嵌套的Level
;with cte(id,parentid,descr,Level) as ( select id,parentid,descr,0 as Level from dbo.emph where id=2 union all select e.ID,e.ParentID,e.Descr,Level+1 as Level from dbo.emph e inner join cte c on e.ParentID=c.id ) select * from cte order by parentid
三,查看每一个行数据的路径
查看每一行数据的Path,便于查看归属关系,path是使用ID来界定的
;with cte(path,id,parentid,descr,Level) as ( select cast('\'+cast(id as varchar) as varchar(100)) as path,
id,parentid,descr,0 as Level from dbo.emph where id=2 union all select cast(c.path+'\'+ cast(e.ID as varchar) as varchar(100)) as path, e.ID,e.ParentID,e.Descr,Level+1 as Level from dbo.emph e inner join cte c on e.ParentID=c.id ) select * from cte order by parentid
推荐文档:
作者:悦光阴
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!