2013-04-09 7 views
0

Я использую SQL Server 2008 Express R2, и у меня есть таблица, которая сама ссылается, потому что у меня есть иерархическая структура.- это тот же рекурсивный CTE и триггер вместо удаления?

Мне нужно удалить корневой узел, но я получаю сообщение об ошибке из-за внешнего ключа. Я прочитал, что могу использовать два варианта, использовать рекурсивный CTE o использовать вместо триггера delete.

В чем разница между ними? который более эффективен?

Спасибо.

+0

Ваши сравнивать яблоки и страусов. Вы можете * реализовать * свой триггер delete *, используя * рекурсивный CTE. –

ответ

1

Когда вы говорите, используйте триггер delete, а не рекурсивный 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 
+0

Да, это то, что я понимаю как CTE, потому что другой вариант, который я вижу, вместо триггера delete, который имеет другой код, но я не знал, были ли они одинаковыми или нет. –

Смежные вопросы