SQL之树形结构无限级联删除
2010-11-23 22:28
337 查看
摘要:树形结构的删除存在其自身特点,特别对于无限级联的树形结构更是如此,今天我们一块看一下如何处理无限级联树的删除问题。
主要内容:
初始工作
SQL实现
总结
一、初始工作
为了更好的说明问题,我首先建立两张表:
代码
这种方法的思路就是通过从上到下的顺序依次查找,首先将查找的内容放到一个Table类型的变量中,而这个变量本身就有一个排序字段可以排序。这样一来我们通过第一次遍历就可以将所要删除的节点id有序的存储到变量中,接着我们再通过倒序遍历的方式遍历这个变量执行删除。
三、总结
这问题关键注意以下几点:第一通过父类节点找子类节点时不一定只有一个子节点,找到的是一个集合,我们要通过一种类型来存放集合变量(也就是上面的table类型);第二就是如何将table变量作为堆栈使用(也就是顺序要可控的);第三是在第一循环之后得到的table型变量无法直接通过"delete from Tree where id in(select id from @tb order by desc)"的方式删除,因为子句中排序是有约束的(不是任何时候都可以的),这里我们是通过游标来解决的(当然还有别的方式)。
主要内容:
初始工作
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)"的方式删除,因为子句中排序是有约束的(不是任何时候都可以的),这里我们是通过游标来解决的(当然还有别的方式)。
相关文章推荐
- SQL之树形结构无限级联删除
- SQL之树形结构无限级联删除(转)
- 使用Oracle数据库实现树形结构表的子-父级递归查询和删除,通过级联菜单简单举例
- oracle 删除级联树形结构数据
- 使用Oracle数据库实现树形结构表的子-父级迭代(递归)查询和删除,通过级联菜单简单举例
- 【SqlServer脚本系列-树形结构级联删除】
- SQL删除树形结构
- 多叉树结合JavaScript树形控件实现无限级树形菜单(一种构建多级有序树形结构JSON(或XML)数据源的方法)
- oracle 树形结构单表 查询 递归SQL
- DropDownList中显示无限级树形结构
- 简单实用SQL脚本Part:生成站点导航树形结构
- SQL, sql server 2000 ,表间数据 ,级联更新删除
- java、js中实现无限层级的树形结构方法(类似递归)
- hibernate - 解决表结构外键限定为非空,级联保存和级联删除抛异常的问题
- SQl 语句 新建,删除,修改表结构
- vue中简单的无限树形结构tree.vue
- SpringBoot+JPA+ElementUi 给级联选择器Cascader返回树形结构数据
- SQL2005级联删除,层叠,设置空,设置默认值
- 无限分类树形结构
- java、js中实现无限层级的树形结构(类似递归)