Рекурсивное удаление строк в самоссылающейся таблице с использованием CTE. Как происходит процесс?
Я работаю над сторонним проектом, и для того, чтобы удалить строку и всех ее потомков в самоссылающейся таблице, я использую рекурсивный CTE, подобный этому, внутри триггера:
CREATE TRIGGER dbo.tr_Comment_Delete
ON dbo.Comment INSTEAD OF DELETE
AS
;WITH IDs AS (
SELECT id FROM DELETED
UNION ALL
SELECT c.id
FROM Comment AS c INNER JOIN IDs AS i
ON c.parent_comment_id = i.id
)
DELETE FROM Comment
WHERE id IN (SELECT id FROM IDs);
GO
Это таблица со ссылками на себя
Хотя этот код работает должным образом, это один из тех случаев, когда вы что-то делаете, но вы не совсем уверены, как он работает.
Чтобы быть более точным, я хотел бы знать, как с помощью этого рекурсивного CTE(идентификатора) я могу избежать ошибок ссылочной целостности, когда пытаюсь удалить комментарий, имеющий дочерние комментарии?
Каков процесс / порядок, в котором комментарии удаляются?
Возьмите эту иерархию комментариев в качестве примера:
3-> 8-> 13
Здесь комментарий id 3 является корневым комментарием. Комментарий 8 является ответом на комментарий 3, так же, как комментарий 13 является ответом на комментарий 8.
Как происходит процесс удаления?
PS Я попытался добавить таблицу, в которую я вставил идентификаторы, как они были рассчитаны. К сожалению, я не могу понять это. Вот результаты такой таблицы:
id ins-date
3 2017-09-12 11:48:38.037
8 2017-09-12 11:48:38.037
13 2017-09-12 11:48:38.037
13 2017-09-12 11:48:38.037
8 2017-09-12 11:48:38.037
13 2017-09-12 11:48:38.037
1 ответ
Я полагаю, вы видите сложность там, где ее нет.
Ваша ошибка:
Удаление строк рекурсивно в самореферентных CTE
Там нет такого понятия, как рекурсивный DELETE
, Только SELECT
может быть.
Таким образом, обработка проста как:
Рассчитать все строки для удаления в
SELECT
с рекуррентным CTEDELETE
все они за одну операцию
Это все