树形数据的处理

java 处理树形结构数据 阅读详情

/*--表结构描述及数据环境:

 表名tb,如果修改表名,则相应修改所有数据处理中涉及到的表名tb
 id为编号(标识字段+主键),pid为上级编号,name为名称,后面可以自行增加其他字段. 
 凡是未特殊标注的地方,对自行增加的字段不影响处理结果

--邹建2003.12(引用请保留此信息)--*/

--测试数据
create table tb(
id int identity(1,1) not null constraint PK_tb primary key clustered,
pid int,name varchar(20))
insert tb  select 0,'中国'
union all select 0,'美国'
union all select 0,'加拿大'
union all select 1,'北京'
union all select 1,'上海'
union all select 1,'江苏'
union all select 6,'苏州'
union all select 7,'常熟'
union all select 6,'南京'
union all select 6,'无锡'
union all select 2,'纽约'
union all select 2,'旧金山'
go


--1.自定义函数--获取编码累计
create function f_getmergid(@id int)
returns varchar(8000)
as
begin
 declare @re varchar(8000),@pid int

 --为了数字排序正常,需要统一编码宽度
 declare @idlen int,@idheader varchar(20)
 select @idlen=max(len(id))
  ,@idheader=space(@idlen)
 from tb

 --得到编码累计
 set @re=right(@idheader+cast(@id as varchar),@idlen)
 select @pid=pid from tb where id=@id
 while @@rowcount>0
  select @re=right(@idheader+cast(@pid as varchar),@idlen)+','+@re
   ,@pid=pid from tb where id=@pid
 return(@re)
end
go


--2.自定义函数--检测某个编码出发,是否被循环引用
create function f_chkid(@id int)
returns bit --循环,返回1,否则返回0
as
begin
 declare @re bit,@pid int
 
 set @re=0

 --检测
 select @pid=pid from tb where id=@id
 while @@rowcount>0
 begin
  if @pid=@id
  begin
   set @re=1
   goto lbErr
  end
  select @pid=pid from tb where id=@pid
 end

lbErr:
 return(@re)
end
go

/*--数据复制

 如果表中包含自定义字段,需要修改存储过程
 存在嵌套不超过32层的问题.
--*/

--3.复制指定结点下的子结点到另一个结点下
create proc p_copy
@s_id int, --复制该项下的所有子项
@d_id int, --复制到此项下
@new_id int --新增加项的开始编号
as
declare @nid int,@oid int,@name varchar(20)
select id,name into #temp from tb where pid=@s_id and id<@new_id
while exists(select 1 from #temp)
begin
 select @oid=id,@name=name from #temp
 insert into tb values(@d_id,@name)
 set @nid=@@identity
 exec p_copy @oid,@nid,@new_id
 delete from #temp where id=@oid
end
go

--4.批量复制的存储过程--复制指定结点及其下面的所有子结点,并生成新结点
create proc p_copystr
@s_id varchar(8000) --要复制项的列表,用逗号分隔
as
declare @nid int,@oid int,@name varchar(20)
set @s_id=','+@s_id+','
select id,name into #temp from tb
where charindex(','+cast(id as varchar)+',', @s_id)>0
while exists(select 1 from #temp)
begin
 select @oid=id,@name=name from #temp
 insert into tb values(@oid,@name)
 set @nid=@@identity
 exec p_copy @oid,@nid,@nid
 delete from #temp where id=@oid
end
go

--5.得到指定id的子id列表
create function f_getchildid(@id int)
returns @re table(id int)
as
begin
 insert into @re select id from tb where pid=@id
 while @@rowcount>0
  insert into @re select a.id
   from tb a inner join @re b on a.pid=b.id
   where a.id not in(select id from @re)
 return
end
go


--6.得到指定id的父id列表
create function f_getparentid(@id int)
returns @re table(id int)
as
begin
 declare @pid int
 select @pid=pid from tb where id=@id
 while @pid<>0
 begin
  insert into @re values(@pid)
  select @pid=pid from tb where id=@pid
 end
 return
end
go


--7.删除指定结点

create proc p_delete
@id int,    --要删除的id
@deletechild bit=0  --是否删除子 1.删除子,0.如果@id有子,则删除失败.
as
 if @deletechild=1
  delete from tb where dbo.f_getmergid(id) like dbo.f_getmergid(@id)+'%'
 else
  if exists(select 1 from tb where pid=@id)
   goto lbErr
  else
   delete from tb where id=@id 
return

lbErr:
 RAISERROR ('该结点下有子结点,不能删除', 16, 1)
go


--8.得到编码累计及编码级别表,这个是针对全表的,主要是应该于全表处理:

create function f_getbmmerg()

returns @re table(id int,idmerg varchar(8000),level int)

as

begin
         declare @idlen int,@idheader varchar(20), @level int
         select @idlen=max(len(id)),@idheader=space(@idlen) from tb
         set @level=1
         insert into @re select id,right(@idheader+cast(id as varchar),@idlen),@level
                   from tb where pid=0
         while @@rowcount>0
         begin
                   set @level=@level+1
                   insert into @re select b.id,a.idmerg+','+right(@idheader+cast(b.id as varchar),@idlen),@level
                            from @re a inner join tb b on a.id=b.pid
                            where a.level=@level-1
         end
return
end
go


--应用:

/*--数据显示排序--*/
--分级显示--横向,先一级,后二级...
select * from tb order by pid

--分级显示--纵向
select * from tb order by dbo.f_getmergid(id)
go

/*--数据统计--*/
--分级统计,每个地区下的明细地区数

select *,
 明细地区数=(select count(*) from tb where dbo.f_getmergid(id) like dbo.f_getmergid(a.id)+',%')
from tb a order by dbo.f_getmergid(id)

go
/*--数据新增,修改
 
 数据新增,修改(包括修改所属的类别)没有什么技巧
 ,只需要检查所属的上级是否存在就行了.这个可以简单的用下面的语句来解决:
 if exists(select 1 from tb where
id=@id) print '存在' else print '不存在'
--*/


--删除'美国'的数据
--exec p_delete 2  --不包含子,因为有美国下有子,所以删除会出错
exec p_delete 2,1 --包含子,将删除美国及所有数据
go


原文参见我在CSDN上发表的贴子

http://expert.csdn.net/Expert/topic/2285/2285830.xml?temp=.1212885

安卓逆向实战:用Batch Apktool 3.8.0快速汉化APK的完整流程 本文详细解析了如何使用Batch Apktool 3.8.0进行安卓APK汉化的完整流程,包括环境配置、反编译、资源解析、深度汉化、重构建与签名优化等关键步骤。通过这款集成化逆向工具,开发者可以高效完成APK汉化,提升工作效率。 阅读详情

相关推荐

Nvidia Jetson CH340 驱动安装

最近调一个USB设备,Windows系统上是可以安装CH340 驱动使用的,移到Jetson AGX Orin 上发现没有 /dev/ttyUSB* 设备显示。是一个为盲人和视力障碍者提供的终端设备驱动程序,它会在系统启动时自动加载并占用串口设备,导致我们无法正常使用部分串口设备。安装完后,内核中已经有。

Vulcan_S的博客 1611

mysql根据父节点递归查询所有子节点

以前有个功能需要递归查询子节点,自己不会写,从网上摘了个sql,改了改能用。这几天又遇到一个类似的功能,但早已忘记sql怎么写,于是翻箱倒柜找出以前和朋友的聊天记录找到了sql,改了改又能用了。怕以后忘记,记录一下。。。这个写法是从网上找的,忘了从哪儿摘的了。。。 根据一个父节点查询所有子节点(包含自身) SELECT rd.* FROM (SELECT * FROM sys_dict WHERE parent_id IS NOT NULL) rd, (SELECT @pid...

leonin12的博客 5725

倍福ADS通讯协议深度解析——从握手到数据包的完整旅程

本文以工程师视角,通过Wireshark抓包实战,深度解析了倍福ADS通讯协议的完整工作流程。从TCP三次握手建立连接,到拆解AMS/TCP信封、AMS Header地址与命令解析,再到ADS Data读写请求的载荷构成,完整呈现了一次数据通讯的“旅程”。文章重点剖析了协议包格式,并结合实际案例,提供了基于协议分析的故障排查思路,帮助开发者深入理解并精准调试工业自动化系统通讯。

weixin_29231725的博客 131

tree树形数据处理 扁平化树状 树状扁平化 处理树里的数据

tree树形数据处理扁平化树状树状扁平化处理树里的数据

web修理工 598

树形结构数据处理

树形结构

qq_59076775的博客 1305

树状结构数据数据处理方法大概整理

树状结构数据处理

李耀书 742

树型结构数据处理----递归方法

一般在实际项目中我们都会遇到层级形式的数据,而且在项目中经常需要将此类数据以树状形式展示出来,不仅如此,还需要对其进行各种处理,这篇文章就来总结一下对层级数据的各种处理操作吧。

Simon778的博客 2327

js中处理树形数据

平时开发中会经常碰到树形数据,而我们存储的数据往往是扁平的数据,需要在前端或者后端对数据进行进一步处理成前端组件需要的树形数据。在操作完树形数据后再转换成扁平数据发给后端。下面JavaScript 中处理树形数据的方法,包括构建树和解析树。假设我们有一个树形结构的数据,我们要将其解析为一个扁平的数组。假设我们有一个扁平的数组数据,每个元素包含。等属性,我们可以将其构建为树形结构。

a983677218的博客 655

处理树形数据,相同的数据放入list,然后数据进行树形输出

package com.jzb.base.tree; import com.jzb.base.data.JzbDataType; import com.jzb.base.util.JzbTools; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map...

qq_26171035的博客 580

js 处理树形结构数据

js 处理树形结构数据 数据 let data = [ { id: 1, address: '安徽', parent_id: 0 }, { id: 2, address: '江苏', parent_id: 0 }, { id: 3, address: '合肥', parent_id: 1 }, { id: 4, address: '庐阳区', parent_id: 3 }, { id: 5, address: '大杨镇', p

weixin_45364050的博客 4950

java 处理mysql获取树形数据

java 处理mysql获取树形数据 目录 处理一: 使用对象的方式 TreeModel TreeModelList TreeModelListTest 结果: 处理二: Map对象的方式 CommonTree: CommonTreeTest 总结: 在使用mysql数据库,要获取到省市区的数据(以福建的数据为例),返回树型结构的数据。 Mysql 是没办法用oracle的connect by prior了,直接数据库进行查询,因此考虑用java递归遍历,获取到树形数据..

一路向前 3621

java递归处理树形结构数据

在实战开发中经常有需要处理树形菜单、树形目录等等等业务需求。而对于这种产品,在设计数据库时也建议使用id<----->parentId的结构来做。但是最终前端显示多用hightChart或者Echart插件来实现。所以在给前端数据时,最好的做法就是把数据库结构话的数据处理成treeJson格式。本文就简单介绍以递归方式处理数据数据库表结构 id name type...

hmbb222的博客 7926

mysql树形数据处理

Mysql处理树形数据 一、简介 在实际开发中,会遇到类似部门一样的树形数据处理,即部门嵌套。主要是两个方面,获取某个部门的绝对路径(普元信息/企业交付部/研发部/张三),以及获取到某个部门下所有的子部门信息(获取到的子部门id用,号拼接显示)。 二、数据处理 1、获取部门的绝对路径 给出指定 ...

江南V的博客 597

springboot中处理树形数据

平时开发中会经常碰到树形数据,而我们存储的数据往往是扁平的数据,需要在前端或者后端对数据进行进一步处理成前端组件需要的树形数据。下面Java中处理树形数据的方法,包括构建树和解析树。假设我们有一个实体类。

a983677218的博客 544

树形数据处理 记录

1.对树形数据模糊搜索 转载 原创作者小丶侯 搜索结果 let arr = [ { title: '你好吗?', children: [ { title: '很好啊', children: null }, { title: '是吗', children: .

weixin_44070105的博客 245

树形数据处理方法

树形数据结构处理方法--递归·思想

mzy110_的博客 898

树形数据处理

用了好久的也有好些次的树形数据相关的内容,隔段时间还是不能立马想起来。 将树形数据扁平化(树形数据转化为一维数组) let treeData = [ { id: 1, pid: "", txt: 1, children: [ { id: 11, pid: 1, txt: 11, children: [ { id: 111, pid: 11, txt: 111 }, { id: 112

weixin_45052838的博客 916

java导入excel数据树形处理

前言 今天收到一个导入的任务,要求将excel数据保存到数据库中,不同于普通的导入,这个导入的数据是一个树形结构,如下图: 通过观察数据中的层级列我们发现表格数据由2棵树组成,分别是第3,4,5,6,7,8,9,10,11和12,13,14,15,16,17,18,它们由0作树的根节点,1为0的子节点,2为相邻1的子节点,由此得出第一颗树的结构为: 一:拆分原始数据 1.引入库 创建vo接收解析数据,在这里,我们只关心层级 @Excel(

cheng的博客 3601

table-tree 表格树、树形数据处理数据树形数据

table-tree 表格树、树形数据处理数据树形数据 前言 公司想搞个表格树的展示页面,看着element有个表格树,还以为可以用。 用出来只用表格没有树,研究半天没研究个所以然,只能从新找个 npm里找到一个:vue-table-with-tree-grid 正文 element的坑 element:http://elemen...

weixin_42718460的博客 1万+

树形数据处理

1.以下为后端返回数据,需要处理树形结构数据。 var list = [ { id: 2, name: 'declare', parent: 0 }, { id: 3, name: 'gps', parent: 0 }, { id: 4, name: 'gui', parent: 1 }, { id: 5, name: 'http', parent: 1 }, { id: 0, name: ...

qq_40959617的博客 1048
上一篇: 数据库备份与还原处理
下一篇: 化解字符串不能超过8000的方法及交叉表的处理
zjcxc
博客等级 码龄24年 5890粉丝 198原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值