2016-05-05 15 views
6

Ho 3 tabelle.Elimina da 2 tabelle utilizzando INNER JOIN

  • InvoiceOriginal
  • fattura
  • InvoiceHistory

tabella delle fatture ha un vincolo di chiave esterna. Ogni voce nella tabella delle fatture ha una voce corrispondente in Invoiceoriginal.

La tabella di fattura originale memorizza i valori originali della fattura e la tabella delle fatture memorizza i valori che sono stati modificati dall'utente. questo è fatto per ottenere diferrences al momento della presentazione.

SQL che sto usando è

DELETE i 
FROM invoice i 
INNER JOIN InvoiceHistory aih 
    ON i.ClientId = aih.HistoryClientNumber 
    AND i.invoiceNumber = HistoryInvoiceNumber 

tuttavia la cancellazione non è possibile a causa del vincolo di chiave esterna.

Il tavolo è come sotto:

Invoice   InvoiceOriginal   InvoiceHistory 
Id    FK_InvoiceId   ClientId 
ClientId   ClientId    InvoiceNumber 
InvoiceNumber 

ho bisogno di eliminare la voce nella fattura e InvoiceOriginal una volta che c'è una voce per quel numero di fattura nel InvoiceHistory per lo stesso clientId.

+0

se necessario l'eliminazione in una singola query utilizza il ON DELETE CASCADE nella schema della tabella. consulta http://stackoverflow.com/questions/6260688/how-do-i-use-cascade-delete-with-sql-server –

risposta

7

Non si può rilasciare una dichiarazione di eliminazione contro più di una tabella alla volta, è necessario disporre di istruzioni DELETE individuali per ciascuna delle tabelle correlate prima di eliminare il record padre (s)

4

sono abbastanza sicuro che impossibile eliminare da più tabelle con una singola istruzione. Normalmente cancellerei le righe figlio con una sola istruzione e quindi cancellerei il record principale. Si potrebbe desiderare di farlo all'interno di una transazione se potrebbe essere necessario eseguire il rollback in caso di fallimento.

In alternativa, è possibile abilitare CASCADE ON DELETE sulla chiave esterna che automaticamente sovrapporrebbe le eliminazioni tramite i record figlio se questo è adatto per questo sistema.

+0

Puoi per favore fornire la sintassi su CASCADE ON DELETE – SJMan

+0

Hai configurato la chiave esterna https : //msdn.microsoft.com/en-GB/library/ms188066.aspx – wizzardmr42

2

Non è possibile eliminare i record da più tabelle da una singola query. Ma ci sono due metodi per risolvere questo

  1. eliminare tutti i record correlati da bambino o tabella di mappatura, e poi elimina il record della tabella padre/intestazione. (Richieste più richieste qui. Utilizzare SQL Transaction per un controllo migliore).

  2. Oppure, Modifica il tuo vincolo di chiave esterna per ON DELETE CASCADE