Löschen von 2 Tabellen mit INNER JOIN

Ich habe 3 Tische.

  • InvoiceOriginal
  • Rechnung
  • RechnungGeschichte

Die Rechnertabelle hat eine Fremdschlüssel-Einschränkung. Jeder Eintrag in der Rechnungstabelle hat einen entsprechenden Eintrag in Invoiceoriginal.

Die RechnungOriginal Tabelle speichert die ursprünglichen Werte der Rechnung und der Rechnertabelle speichert die vom Benutzer modifizierten Werte. Dies geschieht, um zum timepunkt der Einreichung Unterschiede zu bekommen.

Die SQL, die ich verwende, ist

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

Allerdings ist die Löschung wegen der Fremdschlüsselbeschränkung nicht möglich.

Der Tisch ist wie folgt:

 Invoice InvoiceOriginal InvoiceHistory Id FK_InvoiceId ClientId ClientId ClientId InvoiceNumber InvoiceNumber 

Ich muss den Eintrag in Rechnung und InvoiceOriginal löschen, sobald ein Eintrag für diese Rechnungsnummer in InvoiceHistory für denselben ClientId vorhanden ist.

Sie können keine Delete-statement gegen mehr als eine Tabelle zu einem timepunkt ausgeben, Sie müssen einzelne Delete-statementen für jede der verwandten Tabellen haben, bevor Sie den übergeordneten datasatz löschen,

Ich bin ziemlich sicher, dass du nicht aus mehreren Tabellen mit einer einzigen statement löschen kannst. Ich würde normalerweise die untergeordneten Zeilen zuerst mit einer statement löschen und dann den übergeordneten datasatz löschen. Vielleicht möchten Sie dies in einer Transaktion tun, wenn Sie möglicherweise auf Ausfall zurückgreifen müssen.

Alternativ können Sie CASCADE ON DELETE auf dem Fremdschlüssel aktivieren, der automatisch die Löschungen durch die untergeordneten datasätze kaskadiert, wenn das für dieses System geeignet ist.

Sie können die datasätze aus einer Tabelle nicht aus einer einzigen Abfrage löschen. Aber du hast zwei methods, um das zu lösen

  1. Löschen Sie alle zugehörigen datasätze aus der Kind- oder Mapping-Tabelle und löschen Sie dann den Parent / Header-Tabellendatensatz. (Mehrere Abfragen hier erforderlich. Verwenden Sie SQL Transaction für eine bessere Kontrolle).

  2. Oder Ändern Sie Ihre Fremdschlüssel-Einschränkung auf ON DELETE CASCADE