none
Query Eliminazione RRS feed

  • Domanda

  • Ciao ragazzi,

    ho 4 tabelle sql: tab1 è la tabella principale delle pratiche con id_prat tipo int ed identity.

    tab2 tabella fasi, tab3 tabella upload, tab4 tabella comunicazioni. Tutte sono collegate tra di loro tramite id_prat.

    Non riesco ha strutturare la query che mi elimini completamente tutte le righe dalle tabelle in riferimento all' ID_PRAT della tab1 tabella principale.

    Semplificando se elimino la pratica n. 1 vorrei eliminare qualsiasi riga da tutte le tabelle con quell'id.

    Ringrazio a tutti in anticipo.

    Luigi.  

    giovedì 23 ottobre 2014 11:09

Risposte

  • Ciao,

    non so se ho capito bene, ma se hai l'id pratica, basta fare la DELETE nell'ordine corretto, ovvero, prima i figli e poi il padre. E, nel tuo caso, con x = all'id che vuoi eliminare, immagino sia una cosa tipo:

    DELETE FROM tab2 WHERE id_prat = x;

    DELETE FROM tab3 WHERE id_prat = x;

    DELETE FROM tab4 WHERE id_prat = x;

    e poi

    DELETE FROM tab1 WHERE id_prat = x; (principale)

    Spero di aver capito la problematica..


    Alessandro Alpi SQL Server MVP


    giovedì 23 ottobre 2014 12:16
    Moderatore

Tutte le risposte

  • Ciao Luigi,

    se ti è possibile modificare la struttura delle tabelle, potresti introdurre, nelle tre tabelle tab2 tab3 tab4 una foreign key che punti al campo id_prat della tabella principale, in modo che il procedimento di eliminazione sia automatizzato e reso dipendente dalla tabella principale. Un esempio di come fare lo puoi trovare al seguente link: http://sqlandme.com/2011/08/08/sql-server-how-to-cascade-updates-and-deletes-to-related-tables/

    Se non volessi/potessi sfruttare questa possibilità, potresti magari pensare di implementare una stored procedure che, dato un parametro in ingresso (l'id della pratica), esegua le quattro DELETE richieste. Per esempio, così:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE PROCEDURE EliminaPratica @IdPrat INT
    AS
    BEGIN
    	SET NOCOUNT ON;
    
        DELETE FROM tab1 WHERE id_prat = @IdPrat
        DELETE FROM tab2 WHERE id_prat = @IdPrat
        DELETE FROM tab3 WHERE id_prat = @IdPrat
        DELETE FROM tab4 WHERE id_prat = @IdPrat
    
    END
    GO


    Richiamandola poi con 

    EXEC EliminaPratica @IdPrat = X

    dove, ovviamente, X è il numero di pratica da eliminare


    Emiliano Musso - MVP Visual Basic

    giovedì 23 ottobre 2014 12:11
  • Ciao,

    non so se ho capito bene, ma se hai l'id pratica, basta fare la DELETE nell'ordine corretto, ovvero, prima i figli e poi il padre. E, nel tuo caso, con x = all'id che vuoi eliminare, immagino sia una cosa tipo:

    DELETE FROM tab2 WHERE id_prat = x;

    DELETE FROM tab3 WHERE id_prat = x;

    DELETE FROM tab4 WHERE id_prat = x;

    e poi

    DELETE FROM tab1 WHERE id_prat = x; (principale)

    Spero di aver capito la problematica..


    Alessandro Alpi SQL Server MVP


    giovedì 23 ottobre 2014 12:16
    Moderatore
  • Ciao ragazzi,

    ho risolto implementando la struttura di Alessandro in questo modo:

    Protected Sub Button_Delete(ByVal sender As Object, e As System.EventArgs)
            Dim id_ric As Label = DirectCast(FormView1.FindControl("ID_RIC"), Label)
            Dim EliminaRichiesta As String = "DELETE FROM RIC_PRIVATI WHERE ID_RIC = @ID_RIC"
            Dim EliminaFasiRichiesta As String = "DELETE FROM FASI_RIC_PRIVATI WHERE ID_RIC = @ID_RIC"
            Dim EliminaDocumentiRichiesta As String = "DELETE FROM UPLOAD_DOCIDENTITA_RICHIESTE_PRIVATI WHERE ID_RIC = @ID_RIC"
            Using cmd As New SqlCommand(EliminaRichiesta)
                cmd.Connection = sqlCon
                cmd.Parameters.AddWithValue("@ID_RIC", SqlDbType.Int).Value = id_ric.Text
                sqlCon.Open()
                cmd.ExecuteNonQuery()
                sqlCon.Close()
            End Using
            Using cmd As New SqlCommand(EliminaFasiRichiesta)
                cmd.Connection = sqlCon
                cmd.Parameters.AddWithValue("@ID_RIC", SqlDbType.Int).Value = id_ric.Text
                sqlCon.Open()
                cmd.ExecuteNonQuery()
                sqlCon.Close()
            End Using
            Using cmd As New SqlCommand(EliminaDocumentiRichiesta)
                cmd.Connection = sqlCon
                cmd.Parameters.AddWithValue("@ID_RIC", SqlDbType.Int).Value = id_ric.Text
                sqlCon.Open()
                cmd.ExecuteNonQuery()
                sqlCon.Close()
            End Using
        End Sub

    buona serata a tutti.

    Luigi.

    giovedì 23 ottobre 2014 19:37