您的位置:首页 > 数据库

SQL之树形结构无限级联删除

2010-11-23 22:28 337 查看
摘要:树形结构的删除存在其自身特点,特别对于无限级联的树形结构更是如此,今天我们一块看一下如何处理无限级联树的删除问题。

主要内容:


初始工作

SQL实现

总结

一、初始工作

为了更好的说明问题,我首先建立两张表:

代码

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        KenshinCui
-- Create date: 2010.11.22
-- Description:    无限级联删除
-- =============================================
CREATE PROCEDURE NodeDelete
@id BIGINT
AS
BEGIN
DECLARE @tbIds TABLE(id BIGINT)
DECLARE @tempTbs TABLE(id BIGINT)
DECLARE @tb TABLE(id BIGINT,orderIndex BIGINT IDENTITY(1,1))
INSERT INTO @tbIds(id) VALUES(@id)
INSERT INTO @tempTbs(id) VALUES(@id)
INSERT INTO @tb(id) VALUES(@id)
WHILE EXISTS(SELECT id FROM @tbIds)
BEGIN
DELETE FROM @tbIds
INSERT INTO @tb SELECT ID FROM dbo.Tree WHERE ParentID IN (SELECT ID FROM @tempTbs)
INSERT INTO @tbIds SELECT ID FROM dbo.Tree WHERE ParentID IN (SELECT ID FROM @tempTbs)

DELETE FROM @tempTbs
INSERT INTO @tempTbs SELECT id FROM @tbIds
END

DECLARE @tid INT
DECLARE myCursor CURSOR FOR SELECT id FROM @tb ORDER BY orderIndex DESC
OPEN myCursor
FETCH NEXT FROM myCursor INTO @tid
WHILE @@fetch_status=0
BEGIN
DELETE FROM dbo.Tree WHERE ID =@tid

FETCH NEXT FROM myCursor INTO @tid
END
CLOSE myCursor
DEALLOCATE myCursor
END
GO


这种方法的思路就是通过从上到下的顺序依次查找,首先将查找的内容放到一个Table类型的变量中,而这个变量本身就有一个排序字段可以排序。这样一来我们通过第一次遍历就可以将所要删除的节点id有序的存储到变量中,接着我们再通过倒序遍历的方式遍历这个变量执行删除。

三、总结

这问题关键注意以下几点:第一通过父类节点找子类节点时不一定只有一个子节点,找到的是一个集合,我们要通过一种类型来存放集合变量(也就是上面的table类型);第二就是如何将table变量作为堆栈使用(也就是顺序要可控的);第三是在第一循环之后得到的table型变量无法直接通过"delete from Tree where id in(select id from @tb order by desc)"的方式删除,因为子句中排序是有约束的(不是任何时候都可以的),这里我们是通过游标来解决的(当然还有别的方式)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: