with una terminada recursivo recursividad recursiva procedimiento máxima instrucción hacer finalizar ejemplo datos cte consulta como arbol antes agotó sql-server triggers recursive-query sql-cte

sql-server - una - procedimiento recursivo sql server



Eliminar filas recursivamente en una tabla de autorreferencia usando un CTE. ¿Cómo se lleva a cabo el proceso? (1)

Estoy trabajando en un proyecto paralelo, y para eliminar una fila y todos sus descendientes en una tabla de autorreferencia, estoy usando un CTE recursivo como este dentro de un desencadenador:

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

Esta es la tabla de autorreferencia

Aunque tengo este código funcionando como se esperaba, es uno de esos casos en los que haces algo, pero no estás muy seguro de cómo funciona.

Para ser más precisos, lo que me gustaría saber es cómo es que al usar este CTE recursivo (IDs) puedo evitar los errores de integridad referencial cuando intento eliminar un comentario que tiene comentarios secundarios.

¿Cuál es el proceso / orden en que se eliminan los comentarios?

Tome esta jerarquía de comentarios como un ejemplo:

3-> 8-> 13

Aquí el comentario de id 3 es el comentario raíz. El comentario 8 es una respuesta al comentario 3, al igual que el comentario 13 es una respuesta al comentario 8.

¿Cómo se lleva a cabo el proceso de eliminación?

PD. Intenté agregar una tabla en la que insertara los ID a medida que se calculaban. Desafortunadamente no puedo encontrarle sentido. Estos son los resultados de dicha tabla:

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


Supongo que ves complejidad donde no existe.

Tu error es:

Eliminar filas recursivamente en CTE auto referenciado

No existe tal cosa como DELETE recursivo. Solo SELECT puede ser.

Entonces el procesamiento es simple como:

  1. Calcule todas las filas para eliminar en SELECT con CTE recurrente

  2. DELETE a todos con una sola operación

Eso es todo