gre*_*mac 5 t-sql sql-server-2005
我有这样一张桌子:
groupId guid PK
parentId guid
name
left int
right int
Run Code Online (Sandbox Code Playgroud)
从parentId到groupId有一个外键(这是一个自引用表).
左和右是用于维护层次结构的MPTT左/右值.这里要注意的重要事项是左值越大,项目嵌套越深(换句话说:对于任何给定的项目,其左值总是大于所有父项的左值).
我正在尝试编写一个快速的DELETE语句来删除除最顶层组(总是有一个空的GUID值)之外的所有内容,例如:
DELETE FROM [group] WHERE [groupId] <> '00000000-0000-0000-0000-000000000000'`
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用,因为在任何给定组下面通常存在防止删除的子组.如果反复运行DELETE查询,最终会删除所有内容,但这显然不是一个好的解决方案.
我想要的是相当于:
DELETE FROM [group] WHERE [groupId] <> '00000000-0000-0000-0000-000000000000'
ORDER BY [left] DESC
Run Code Online (Sandbox Code Playgroud)
当然,这是不允许的语法,但实际上,它应该首先删除具有最大左值的项目,以确保下面没有可防止由于FK约束而删除的组.
我也尝试过:
delete from [group] where groupid in (
select top 1000000 * from [group]
where groupid <> '00000000-0000-0000-0000-000000000000'
ORDER BY [left] desc
)
Run Code Online (Sandbox Code Playgroud)
这是有效的语法(如果你也使用TOP,你只能使用ORDER BY)但实际上并没有导致DELETE按返回的行的顺序发生,所以它仍然不起作用.
这是可以做到的,而无需借助光标逐个删除行吗?