gpt4 book ai didi

sql-server-2005 - SQL : DELETE data from self-referencing table in specific order

转载 作者:行者123 更新时间:2023-12-04 07:10:05 24 4
gpt4 key购买 nike

我有一张这样的表:

groupId guid PK
parentId guid
name
left int
right int

从 parentId 到 groupId 有一个外键(这是一个自引用表)。

左右为 MPTT用于维护层次结构的左/右值。这里要注意的重要一点是,左值越大,一个项目的嵌套越深(换句话说:对于任何给定的项目,它的左值总是大于所有父项的左值)。

我正在尝试编写一个快速 DELETE 语句来删除除最顶层组(始终具有空 GUID 值)之外的所有内容,例如:
DELETE FROM [group] WHERE [groupId] <> '00000000-0000-0000-0000-000000000000'`

不幸的是,这不起作用,因为通常在任何给定组下面都有子组阻止删除。如果您一遍又一遍地运行该 DELETE 查询,最终它会删除所有内容,但这显然不是一个好的解决方案。

我想要的是相当于:
DELETE FROM [group] WHERE [groupId] <> '00000000-0000-0000-0000-000000000000' 
ORDER BY [left] DESC

当然,这是不允许的语法,但实际上,它应该首先删除具有最大左值的项目,以确保下面没有组会阻止由于 FK 约束而导致删除。

我也试过:
delete from [group] where groupid in (
select top 1000000 * from [group]
where groupid <> '00000000-0000-0000-0000-000000000000'
ORDER BY [left] desc
)

这是有效的语法(如果您也使用 TOP,则只能使用 ORDER BY)但实际上不会导致 DELETE 按返回行的顺序发生,因此它仍然不起作用。

这是否可以做到,而无需借助游标逐一删除行?

最佳答案

尝试

ALTER TABLE [group] NOCHECK CONSTRAINT ALL
go
DELETE FROM [group] WHERE [groupId] <> '00000000-0000-0000-0000-000000000000'
go
ALTER TABLE [group] CHECK CONSTRAINT ALL
go

如果 table 很大,这可能是一个不错的选择。
select * into #temptable from [group] WHERE [groupId] = '00000000-0000-0000-0000-000000000000'
go
truncate table [group]
go
select * into [group] from #temptable
go
drop table #temptable
go

关于sql-server-2005 - SQL : DELETE data from self-referencing table in specific order,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5200488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com