2016-05-05 23 views
6

Mam 3 tabele.Usuń z 2 tabel przy użyciu INNER JOIN

  • InvoiceOriginal
  • Faktura
  • InvoiceHistory

tabeli faktura ma klucz obcy. Każdy wpis w tabeli faktury ma odpowiedni wpis w polu Invoiceoriginal.

Tabela invoiceOriginal przechowuje oryginalne wartości faktury, a tabela faktury przechowuje wartości, które zostały zmodyfikowane przez użytkownika. robi się to, aby uzyskać różnice w momencie przesyłania.

SQL używam jest

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

jednak usunięcie nie jest możliwe ze względu na ograniczenia klucz obcy.

Stół jest w ramach:

Invoice   InvoiceOriginal   InvoiceHistory 
Id    FK_InvoiceId   ClientId 
ClientId   ClientId    InvoiceNumber 
InvoiceNumber 

muszę usunąć wpis w fakturze i InvoiceOriginal raz znajduje się wpis dla tego numeru faktury w InvoiceHistory dla tego samego ClientID.

+0

jeśli wymagane usunięcie w jednym zapytaniu użyć ON DELETE CASCADE w schemacie tabeli. refer http://stackoverflow.com/questions/6260688/how-do-i-use-cascade-delete-with-sql-server –

Odpowiedz

7

Nie można wydać delete przed więcej niż jednym stole w czasie, trzeba mieć indywidualne DELETE dla każdego z powiązanych tabel przed usunięciem rekordu (ów) rodzice

4

Jestem całkiem pewien, że nie można usunąć z wielu tabel za pomocą pojedynczej instrukcji. Zazwyczaj najpierw usuwam wiersze podrzędne z jedną instrukcją, a następnie usuwam rekord nadrzędny. Możesz to zrobić w transakcji, jeśli będziesz musiał wycofać się po awarii.

Alternatywnie można włączyć CASCADE ON DELETE na kluczu obcym, który automatycznie kasowałby skreślenia w rekordach potomnych, jeśli jest to odpowiednie dla tego systemu.

+0

Czy możesz podać składnię na CASCADE ON DELETE – SJMan

+0

Ustawiłeś go na klucz obcy https : //msdn.microsoft.com/en-GB/library/ms188066.aspx – wizzardmr42

2

Nie można usunąć rekordów z wielu tabel z pojedynczego zapytania. Ale istnieją dwa sposoby, aby rozwiązać ten

  1. Usuń wszystkie powiązane rekordy z dzieckiem lub tabeli odwzorowania, a następnie usunąć rekord tabeli nadrzędnej/cel. (Wymagane jest wiele zapytań. Aby uzyskać lepszą kontrolę, użyj wartości SQL Transaction).

  2. Albo, modyfikować swój klucz obcy do ON DELETE CASCADE