首页 > 其他分享 >获取树形数据的全路径

获取树形数据的全路径

时间:2023-02-20 23:24:43浏览次数:32  
标签:Title -- 路径 节点 获取 树形 tbDept ParentID ID

我们经常要用到树形数据,比如:部门、文章栏目、行政区划……,而且有时还需要用到这些数据的全路径,比如:四川省 > 遂宁市 > 船山区。

为了避免每次要使用全路径时都拼接一次,我们可以在数据库增加一个字段来保存全路径,并且使用触发器来生成全路径。

典型的表结构如下:

 由于新增的节点都处于末级,没有子节点,只需要修改新增节点的全路径,如下:

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)'),否则尖括号会被转义
    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

数据示例如下:

 

 

标签:Title,--,路径,节点,获取,树形,tbDept,ParentID,ID
From: https://www.cnblogs.com/info-tech/p/17139301.html

相关文章

  • m基于GA遗传优化的AGV栅格地图路径规划和避障matlab仿真
    1.算法描述        遗传算法GA把问题的解表示成“染色体”,在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群“染色体”,也即是假设解。然后,把这些......
  • js获取blob数据流中携带的msg消息
    问题:后端返回的失败blob数据流,前端如何捕获展示  业务需求,需要后端控制文件下载频率,用户在短时间内不可以重复下载文件,并返回消息提示(剩余XX秒)。前端需要把返......
  • POI如何读取树形结构的excel文件?并产生树形结构
    主要代码importjava.io.File;importjava.io.IOException;importorg.apache.poi.openxml4j.exceptions.InvalidFormatException;importorg.apache.poi.ss.usermo......
  • 前端获取文件后缀名称
    getFileExtension=(fileName)=>{returnfileName.substring(fileName.lastIndexOf('.')+1)}constisExcel=(fileName)=>{constfileExt=getFileExten......
  • 前端从接口的header中获取filename
    getFileNameFromHeaders=(headers)=>{constdisposition=headers['content-disposition']letfileName='未命名'try{fileName=disposition.split......
  • TCP编程之网卡信息获取和域名解析
    1.TCP/IP简介TCP/IP协议源于1969年,是针对Internet开发的一种体系结构和协议标准,目的在于解决异种计算机网络的通信问题。使得网络在互联时能为用户提供一种通用、一致的通信......
  • python 获取b站 个人关注列表用户信息
    前言本程序是get_bili_medal_list项目的一个子程序,用于获取个人关注列表用户信息。整体很简单,没啥东西,主要是辅助作用。数据获取完毕后,存储于data/follows.json(提前......
  • hihoCoder 1081 : 最短路径·一
    #1081:最短路径·一10000ms1000ms256MB描述万圣节的早上,小Hi和小Ho在经历了一个小时的争论后,终于决定了如何度过这样有意义的一天——他们决定去闯鬼屋!在鬼屋门......
  • hihoCoder 1089 : 最短路径·二:Floyd算法
    #1089:最短路径·二:Floyd算法10000ms1000ms256MB描述万圣节的中午,小Hi和小Ho在吃过中饭之后,来到了一个新的鬼屋!鬼屋中一共有N个地点,分别编号为1..N,这N个地点之......
  • js获取url中的查询参数
    //获取url中query//return{cate_id:'1',street_id:'0'}functiongetParams(){ varurl=location.search//获取url中"?"符后的字串 vartheRequest=newObj......