none
eliminazione di righe da una tabella con vincolo autoreferenziale. RRS feed

  • Domanda

  • Ciao,

    ho una tabella con un vincolo autoreferenziale.

    Devo eliminare dalla tabella tutte le righe relative ad un ramo (dall'elemento root fino all'ultimo figlio)

    Ho tentato in questo modo:

    DELETE Sales.tbl_Documenti

    WHERE IDDocumento  IN (SELECT IDDocumento FROM [Sales].[tblufn_Documenti_GetCronologiaDocumentoAncestor](@IDDocumento))


    dove la [Sales].[tblufn_Documenti_GetCronologiaDocumentoAncestor] restituisce appunto tutto il ramo (e anche ordinato)....solo che ottengo sempre e comunque l'errore di andare a eliminare righe con riferimenti.

    come posso garantire l'ordinamento corretto delle eliminazioni?

    grazie,
    Marco Bosco

     


    Marco Bosco
    giovedì 10 marzo 2011 17:09

Risposte

  • Ciao Marco,

    puoi provare ad usare una CTE come nell'esempio seguente:

    USE TEMPDB
    GO
    
    CREATE TABLE X (Id int NOT NULL PRIMARY KEY, Parent int NULL)
    GO
    
    ALTER TABLE X
    ADD CONSTRAINT FK_1 FOREIGN KEY (Parent) REFERENCES X(Id)
    GO
    
    
    INSERT INTO X VALUES (1, NULL)
    INSERT INTO X VALUES (2, 1)
    INSERT INTO X VALUES (3, 2)
    INSERT INTO X VALUES (4, 1)
    INSERT INTO X VALUES (5, 1)
    INSERT INTO X VALUES (6, NULL)
    INSERT INTO X VALUES (7, 6)
    INSERT INTO X VALUES (8, 7)
    INSERT INTO X VALUES (9, 8)
    GO
    
    SELECT * FROM X
    
    -- Non funziona per via della FK
    -- DELETE FROM X WHERE ID=6
    
    DECLARE @Id int;
    SET @Id = 1;
    
    WITH MyCTE(Id) 
    AS (
      SELECT Id FROM X WHERE Id = @Id
      
      UNION ALL
      
      SELECT X.Id
       FROM X
       JOIN MyCTE ON X.Parent = MyCTE.Id
    )
    DELETE X
    WHERE Id IN (SELECT Id FROM MyCTE)
    OPTION (MAXRECURSION 0)
    
    
    
    Ciao!


    Danilo Dominici MCP MCDBA MCITP MCSE MCAD
    • Proposto come risposta Anca Popa mercoledì 16 marzo 2011 08:12
    • Contrassegnato come risposta Anca Popa giovedì 17 marzo 2011 07:23
    martedì 15 marzo 2011 11:31