同步删除被删除节点的所有子节点(BOM节点删除)
2009-04-28 13:53
302 查看
----------------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2009-04-28 13:53:00
-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
-- Blog : http://blog.csdn.net/htl258 ----------------------------------------------------------------------------------
IF OBJECT_ID('tb') IS NOT NULL
DROP TABLE tb
GO
CREATE TABLE tb
(
ID INT,
Name VARCHAR(50),
PID INT
)
GO
INSERT INTO tb
SELECT 1, 'A', 0 UNION ALL
SELECT 2, 'A1', 1 UNION ALL
SELECT 3, 'A2', 1 UNION ALL
SELECT 4, 'A3', 1 UNION ALL
SELECT 5, 'A21', 2 UNION ALL
SELECT 6, 'A31', 3 UNION ALL
SELECT 7, 'A211', 6 UNION ALL
SELECT 8, 'B', 0 UNION ALL
SELECT 9, 'B1', 8
GO
-- SQL2000以上版本写法
-- 删除处理触发器(同步删除被删除节点的所有子节点)
IF OBJECT_ID('tr_DelTree')>0
DROP TRIGGER tr_DelTree
GO
CREATE TRIGGER tr_DelTree ON tb
FOR DELETE
AS
IF @@ROWCOUNT=0 RETURN --如果没有满足删除条件的记录,直接退出
-- 查找所有被删除节点的子节点
SET NOCOUNT ON
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
SET NOCOUNT OFF
GO
-- 删除一条记录测试:
DELETE tb WHERE id=2
-- 查询最终结果:
SELECT * FROM tb
/*
ID Name PID
----------- -------------------------------------------------- -----------
1 A 0
3 A2 1
4 A3 1
6 A31 3
7 A211 6
8 B 0
9 B1 9
(7 行受影响)
*/
-- SQL2005以上版本
IF OBJECT_ID('tr_DelTree')>0
DROP TRIGGER tr_DelTree
GO
CREATE TRIGGER tr_DelTree ON tb
FOR DELETE
AS
WITH t AS
(
SELECT ID
FROM DELETED
UNION ALL
SELECT a.ID
FROM tb a
JOIN t b
ON a.PID = b.id
)
DELETE tb
WHERE EXISTS(
SELECT 1
FROM t
WHERE id = tb.id
)
GO
--删除一条记录测试:
DELETE tb WHERE id=1
--查询最终结果:
SELECT * FROM tb
/*
ID Name PID
----------- -------------------------------------------------- -----------
8 B 0
9 B1 8
(2 行受影响)
*/
-- Author : htl258(Tony)
-- Date : 2009-04-28 13:53:00
-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
-- Blog : http://blog.csdn.net/htl258 ----------------------------------------------------------------------------------
IF OBJECT_ID('tb') IS NOT NULL
DROP TABLE tb
GO
CREATE TABLE tb
(
ID INT,
Name VARCHAR(50),
PID INT
)
GO
INSERT INTO tb
SELECT 1, 'A', 0 UNION ALL
SELECT 2, 'A1', 1 UNION ALL
SELECT 3, 'A2', 1 UNION ALL
SELECT 4, 'A3', 1 UNION ALL
SELECT 5, 'A21', 2 UNION ALL
SELECT 6, 'A31', 3 UNION ALL
SELECT 7, 'A211', 6 UNION ALL
SELECT 8, 'B', 0 UNION ALL
SELECT 9, 'B1', 8
GO
-- SQL2000以上版本写法
-- 删除处理触发器(同步删除被删除节点的所有子节点)
IF OBJECT_ID('tr_DelTree')>0
DROP TRIGGER tr_DelTree
GO
CREATE TRIGGER tr_DelTree ON tb
FOR DELETE
AS
IF @@ROWCOUNT=0 RETURN --如果没有满足删除条件的记录,直接退出
-- 查找所有被删除节点的子节点
SET NOCOUNT ON
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
SET NOCOUNT OFF
GO
-- 删除一条记录测试:
DELETE tb WHERE id=2
-- 查询最终结果:
SELECT * FROM tb
/*
ID Name PID
----------- -------------------------------------------------- -----------
1 A 0
3 A2 1
4 A3 1
6 A31 3
7 A211 6
8 B 0
9 B1 9
(7 行受影响)
*/
-- SQL2005以上版本
IF OBJECT_ID('tr_DelTree')>0
DROP TRIGGER tr_DelTree
GO
CREATE TRIGGER tr_DelTree ON tb
FOR DELETE
AS
WITH t AS
(
SELECT ID
FROM DELETED
UNION ALL
SELECT a.ID
FROM tb a
JOIN t b
ON a.PID = b.id
)
DELETE tb
WHERE EXISTS(
SELECT 1
FROM t
WHERE id = tb.id
)
GO
--删除一条记录测试:
DELETE tb WHERE id=1
--查询最终结果:
SELECT * FROM tb
/*
ID Name PID
----------- -------------------------------------------------- -----------
8 B 0
9 B1 8
(2 行受影响)
*/
相关文章推荐
- 删除链表中等于给定值val的所有节点
- datenode节点超时时间设置,Hadoop启动不正常,HDFS冗余数据块的自动删除,NameNode安全模式问题,ntp时间服务同步,机架感知配置
- zTree——删除所有节点
- LintCode 删除链表中等于给定值val的所有节点
- 数据结构:单链表(二)之链表节点排序,升序插入数据,删除指定的所有节点,翻转链表操作
- 给定一个排序的链表,删除所有具有重复数字的节点,从原始列表中只留下不同的数字。
- C/C++ | 28-20 写出程序删除链表中的所有节点
- 删除父节点同时删除该节点上的所有子节点(oracle)
- 第4章第1节练习题12 删除以指定节点为根节点的所有子树
- 删除树节点下的所有节点
- 【JavaScript】存在陷阱:删除某一区域所有节点
- 删除二叉树所有叶子节点---将叶子节点都是设置为0
- 删除链表中等于给定值val的所有节点
- 【工具类代码】递归获取所有的子节点做删除获取用
- 删除链表中等于给定值val的所有节点。
- c实现对给定线性链表head按节点值非递减次序输出所有节点,并把刚输出的节点从链表中删除
- JavaScript删除所有子节点的方法
- AD怎么删除一个节点或元件的所有连线?
- 删除某个节点下所有子节点(oracle)
- 递归删除一个节点以及该节点下的所有节点示例