求一存储过程,关于树型结构删除问题

时间:2021-04-20 11:53:43
A (id1)
|
|----B (parentid,id2)
|   |----C (parentid,id3)
|   |   |----D (parentid,id4)
|   |   |----a,b,c…(parentid,id)
|   |
|   |----D (parentid,id4)
|   |----a,b,c…(parentid,id)
|
|---- C (parentid,id3)
|   |----D (parentid,id4)
|   |----a,b,c…(parentid,id)
|
|----D (parentid,id4)
|----a,b,c…(parentid,id)       
(不会贴图,只好现画了一个,看着可能不是很清楚)
写一个删除的存储过程,要求当删除A时同时将各子节点删除。
id1,id2,id3,id4是四组范围不同的int值,以此可区分出所属的父亲节点,从而得到它的层次。
a,b,c…是若干子表,可以从属于A,B,C(除D),A,B,C从属关系如上。
我只会一条条查出后删除,觉得比较麻烦,而且写出来特别的多。希望能求一个优化的存储过程,我刚刚学,各位好心人指点一下。非常的感谢!

14 个解决方案

#1


没给表结构?

#2


A,B,C,D,a,b,c...表的结构都是(parentid,id)

#3


parentid,id都是int型的?

#4


是的

#5


那确实得一条条找出来删除了.

可以找一条删除一条.
也可以一条条的找到并生成全路径,比如 "1.2.1.2" 这样的,然后用一条 delete from .. where path like '...'来删除.

如果嵌套级数不多的话(32级以内),可以建个触发器, 并且设置启用触发器的自调用,让系统自动帮你去删吧.

#6


刚刚学这个东西,什么触发器都不明白。那递归可不可以阿?我没写出来,求助啊~

#7


自己顶

#8


可用触发器递归

用函数生成所有子的ID..

格式如: delete a from a ,dbo.F_Tree(@ID) b on a.ID=b.ID

#9


05可用output返回deleted.ID这样循环取。。
--------
递归的列子
http://blog.csdn.net/roy_88/archive/2008/01/15/2045842.aspx

#10


8.2.7 实现删除指定结点及所有子节点的处理触发器.sql

CREATE TABLE tb(ID int,PID int,Name nvarchar(10))
INSERT tb SELECT 1,NULL,'山东省'
UNION ALL SELECT 2,1   ,'烟台市'
UNION ALL SELECT 4,2   ,'招远市'
UNION ALL SELECT 3,1   ,'青岛市'
UNION ALL SELECT 5,NULL,'四会市'
UNION ALL SELECT 6,5   ,'清远市'
UNION ALL SELECT 7,6   ,'小分市'
GO

--删除处理触发器(同步删除被删除节点的所有子节点)
CREATE TRIGGER tr_DeleteNode ON tb
FOR DELETE
AS
IF @@ROWCOUNT=0 RETURN --如果没有满足删除条件的记录,直接退出
--查找所有被删除节点的子节点
DECLARE @t TABLE(ID int,Level int)
DECLARE @Level int
SET @Level=1
INSERT @t SELECT a.ID,@Level
FROM tb a,deleted d
WHERE a.PID=d.ID
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t SELECT a.ID,@Level
FROM tb a,@t b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END
DELETE a
FROM tb a,@t b
WHERE a.ID=b.ID
GO

--删除
DELETE FROM tb WHERE ID in(2,3,5)
SELECT * FROM tb
/*--结果
ID          PID        Name 
---------------- ----------------- ---------- 
1           NULL      山东省
--*/

#11


再顶一次!

这两天学习了下触发器,根据我的理解触发器不能满足我的要求。原因:触发器不能建立在临时表上,树型结构根据数据建立临时表后再删除。不知道我说的是否正确

还是求一个存储过程,最好能给出代码(这两天还是没有写出来-_-!)。谢谢上面热心的人

#12


A,B,C,D,a,b,c...表的结构都是(parentid,id)
---------------------------------------------
有很多表?表之间的关联?

#13


有很多的表,上面写错了。A表没有parentid,它是根节点。表之间的如上图,a,b,c…是若干子表,可以从属于A,B,C(除D),A,B,C,D可以严格从上到下按ABCD建立,也可以跳过任意中间表直接进行下位表的建立。

¦ 
¦----B  
¦    ¦----C  
¦         ¦----D (这是严格的)
¦ 
¦----C (这是跳过B建立的C表)

#14


重金诚聘C++
http://topic.csdn.net/u/20080227/14/8bce0844-bd15-42f0-9cda-a343d5d6601b.html?seed=2111206245

#1


没给表结构?

#2


A,B,C,D,a,b,c...表的结构都是(parentid,id)

#3


parentid,id都是int型的?

#4


是的

#5


那确实得一条条找出来删除了.

可以找一条删除一条.
也可以一条条的找到并生成全路径,比如 "1.2.1.2" 这样的,然后用一条 delete from .. where path like '...'来删除.

如果嵌套级数不多的话(32级以内),可以建个触发器, 并且设置启用触发器的自调用,让系统自动帮你去删吧.

#6


刚刚学这个东西,什么触发器都不明白。那递归可不可以阿?我没写出来,求助啊~

#7


自己顶

#8


可用触发器递归

用函数生成所有子的ID..

格式如: delete a from a ,dbo.F_Tree(@ID) b on a.ID=b.ID

#9


05可用output返回deleted.ID这样循环取。。
--------
递归的列子
http://blog.csdn.net/roy_88/archive/2008/01/15/2045842.aspx

#10


8.2.7 实现删除指定结点及所有子节点的处理触发器.sql

CREATE TABLE tb(ID int,PID int,Name nvarchar(10))
INSERT tb SELECT 1,NULL,'山东省'
UNION ALL SELECT 2,1   ,'烟台市'
UNION ALL SELECT 4,2   ,'招远市'
UNION ALL SELECT 3,1   ,'青岛市'
UNION ALL SELECT 5,NULL,'四会市'
UNION ALL SELECT 6,5   ,'清远市'
UNION ALL SELECT 7,6   ,'小分市'
GO

--删除处理触发器(同步删除被删除节点的所有子节点)
CREATE TRIGGER tr_DeleteNode ON tb
FOR DELETE
AS
IF @@ROWCOUNT=0 RETURN --如果没有满足删除条件的记录,直接退出
--查找所有被删除节点的子节点
DECLARE @t TABLE(ID int,Level int)
DECLARE @Level int
SET @Level=1
INSERT @t SELECT a.ID,@Level
FROM tb a,deleted d
WHERE a.PID=d.ID
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t SELECT a.ID,@Level
FROM tb a,@t b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END
DELETE a
FROM tb a,@t b
WHERE a.ID=b.ID
GO

--删除
DELETE FROM tb WHERE ID in(2,3,5)
SELECT * FROM tb
/*--结果
ID          PID        Name 
---------------- ----------------- ---------- 
1           NULL      山东省
--*/

#11


再顶一次!

这两天学习了下触发器,根据我的理解触发器不能满足我的要求。原因:触发器不能建立在临时表上,树型结构根据数据建立临时表后再删除。不知道我说的是否正确

还是求一个存储过程,最好能给出代码(这两天还是没有写出来-_-!)。谢谢上面热心的人

#12


A,B,C,D,a,b,c...表的结构都是(parentid,id)
---------------------------------------------
有很多表?表之间的关联?

#13


有很多的表,上面写错了。A表没有parentid,它是根节点。表之间的如上图,a,b,c…是若干子表,可以从属于A,B,C(除D),A,B,C,D可以严格从上到下按ABCD建立,也可以跳过任意中间表直接进行下位表的建立。

¦ 
¦----B  
¦    ¦----C  
¦         ¦----D (这是严格的)
¦ 
¦----C (这是跳过B建立的C表)

#14


重金诚聘C++
http://topic.csdn.net/u/20080227/14/8bce0844-bd15-42f0-9cda-a343d5d6601b.html?seed=2111206245