sql server - ricorsive - Eliminazione di righe in modo ricorsivo in una tabella autoreferenziale tramite CTE. Come si svolge il processo?



sql server recursive query (1)

Suppongo tu veda la complessità dove non esiste.

Il tuo errore è:

Eliminazione di righe in modo ricorsivo in CTE autoreferenziale

Non esiste il DELETE ricorsivo. Solo SELECT può essere.

Quindi l'elaborazione è semplice come:

  1. Calcola tutte le righe per la cancellazione in SELECT con CTE ricurvo

  2. DELETE tutti con una sola operazione

È tutto

Sto lavorando a un progetto parallelo, e per eliminare una riga e tutti i suoi discendenti in una tabella autoreferenziale, sto usando un CTE ricorsivo come questo all'interno di un trigger:

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

Questa è la tabella autoreferenziale

Anche se ho questo codice che funziona come previsto, è uno di quei casi in cui fai qualcosa, ma non sei abbastanza sicuro di come funzioni.

Per essere più precisi, quello che mi piacerebbe sapere è come sia utilizzando questo CTE (ID) ricorsivo che sono in grado di evitare errori di integrità referenziale quando provo a cancellare un commento che ha commenti secondari?

Qual è il processo / ordine in cui i commenti vengono cancellati?

Prendi questa gerarchia di commenti come esempio:

3-> 8-> 13 

Qui il commento di id 3 è il commento di root. Il commento 8 è una risposta al commento 3, proprio come il commento 13 è una risposta al commento 8.

Come si svolge effettivamente il processo di cancellazione?

PS Ho provato ad aggiungere una tabella in cui ho inserito gli ID come erano calcolati. Sfortunatamente non riesco a capirlo. Questi sono i risultati di tale tabella:

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




sql-cte