Рекурсивное удаление строк в самоссылающейся таблице с использованием 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 может быть.

Таким образом, обработка проста как:

  1. Рассчитать все строки для удаления в SELECT с рекуррентным CTE

  2. DELETE все они за одну операцию

Это все

Другие вопросы по тегам