0
我正在使用SQL Server 2008 Express R2,我有一个自引用的表,因为我有一个层次结构。是一样的递归CTE和触发器而不是删除?
我需要删除根节点,但由于外键导致出错。我已经读过,我可以使用两个选项,使用递归CTE o使用而不是删除触发器。
它们之间的区别是什么?哪个更有效率?
谢谢。
我正在使用SQL Server 2008 Express R2,我有一个自引用的表,因为我有一个层次结构。是一样的递归CTE和触发器而不是删除?
我需要删除根节点,但由于外键导致出错。我已经读过,我可以使用两个选项,使用递归CTE o使用而不是删除触发器。
它们之间的区别是什么?哪个更有效率?
谢谢。
当你说使用删除触发器而不是递归CTE时,我假设你将在触发器中做某种循环,这意味着CTE会更有效率。
对于CTE,你可以试试:
with cte as (
select id as root, parent, id
from [<YourTable>]
where parent is null -- This selects root nodes
union all
select cte.root, d.parent, d.id
from cte
inner join data d on cte.id = d.parent
)
delete from [<YourTable>]
from [<YourTable>]
inner join cte on rel.id = cte.id
where cte.root = 1 -- This is the root to delete
是的,这是我理解为CTE的原因,因为我看到的另一个选项是删除触发器,它具有不同的代码,但我不知道它们是否相同。 – 2013-04-09 08:59:47
你比较苹果和鸵鸟。你可能*实现*你的删除触发器*使用递归CTE。 – 2013-04-09 08:47:31