-
获取树形数据的全路径
我们经常要用到树形数据,比如:部门、文章栏目、行政区划……,而且有时还需要用到这些数据的全路径,比如:四川省 > 遂宁市 > 船山区。
为了避免每次要使用全路径时都拼接一次,我们可以在数据库增加一个字段来保存全路径,并且使用触发器来生成全路径。
典型的表结构如下:
由于新增的节点都处于末级,没有子节点,只需要修改新增节点的全路径,如下:
ALTER TRIGGER [dbo].[trDeptInsert] ON [dbo].[tbDept] AFTER INSERT AS SET NOCOUNT ON --连接inserted表得到新增的数据 --连接tbDept表取得上级节点路径,如果是顶层,就没有上级节点,所以需要LEFT JOIN --如果是顶层,全路径就是节点名称,否则,就是上级节点全路径+当前节点名称 UPDATE A SET Path = CASE WHEN A.ParentID = 0 THEN A.Title ELSE B.Path + ' > ' + A.Title END FROM tbDept A INNER JOIN inserted I ON A.ID = I.ID LEFT JOIN tbDept B ON A.ParentID = B.ID
修改节点后,要做判断,只有修改了节点名称或者所属上级节点,才需要修改全路径,同时,也要修改所有子节点的全路径,如下:
ALTER TRIGGER [dbo].[trDeptUpdate] ON [dbo].[tbDept] AFTER UPDATE AS SET NOCOUNT ON; --递归查出修改了的节点以及他们的所有后代节点 --连接inserted和deleted表,并使用I.ParentID <> D.ParentID OR I.Title <> D.Title判断是否修改了名称和所属父节点 WITH temp AS ( SELECT A.ID FROM tbDept A INNER JOIN inserted I ON A.ID = I.ID INNER JOIN deleted D ON I.ID = D.ID WHERE I.ParentID <> D.ParentID OR I.Title <> D.Title UNION ALL SELECT tbDept.ID FROM temp INNER JOIN tbDept ON temp.ID = tbDept.ParentID ) --CTE数据只能使用一次,所以需要写入临时表,同时增加行号,以便遍历 SELECT ID, RowID = ROW_NUMBER() OVER(ORDER BY ID) INTO #TEMP FROM temp --遍历上面得到的所有节点ID DECLARE @RowCount int = (SELECT COUNT(*) FROM #TEMP), @RowID int = 1 --行数,行号 WHILE @RowCount >= @RowID BEGIN DECLARE @ID int SELECT @ID = ID FROM #TEMP WHERE RowID = @RowID; --递归得到当前节点及其所有父节点名称 WITH temp AS ( SELECT Title, ParentID, Level = 0 FROM tbDept WHERE ID = @ID UNION ALL SELECT A.Title, A.ParentID, Level - 1 FROM tbDept A INNER JOIN temp ON A.ID = temp.ParentID ) --使用FOR XML PATH拼接出节点全路径 --使用STUFF函数去掉前面多余的连接符号 --注意使用TYPE和.value('.','NVARCHAR(MAX)'),否则尖括号会被转义,并且value只能小写 UPDATE tbDept SET Path = STUFF((SELECT ' > '+Title FROM temp ORDER BY Level FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,3,'') WHERE ID = @ID SET @RowID = @RowID + 1 END
数据示例如下:
出处:https://www.cnblogs.com/info-tech/p/17139301.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式