2016-05-05 7 views
6

私は3つのテーブルを持っています。INNER JOINを使用して2つのテーブルから削除

  • InvoiceOriginal
  • 請求書
  • InvoiceHistory

請求書テーブルが外部キー制約を持っています。 請求書テーブルの各エントリには、対応するエントリがInvoiceoriginalにあります。

invoiceOriginalテーブルには請求書の元の値が格納され、請求書テーブルにはユーザーが変更した値が格納されます。 これは送信時に差異を得るために行われます。

私が使用していますSQLは、しかし、削除が外部キー制約のためことはできません

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

です。私は請求書のエントリを削除する必要があるとInvoiceOriginalはかつて同じのclientIdのためInvoiceHistoryでその請求書番号のエントリがある

Invoice   InvoiceOriginal   InvoiceHistory 
Id    FK_InvoiceId   ClientId 
ClientId   ClientId    InvoiceNumber 
InvoiceNumber 

:下のよう

テーブルです。

+0

にあなたの外部キー制約を変更します。 http://stackoverflow.com/questions/6260688/how-do-i-use-cascade-delete-with-sql-serverを参照してください –

答えて

7

一度に複数のテーブルに対してDELETE文を発行することはできません、あなたは親レコード(複数可)

4

を削除する前に、関連する表のそれぞれについて、個別のDELETE文を持っている必要があり、私はかなり確信してます1つのステートメントで複数のテーブルから削除することはできません。私は通常、1つのステートメントで子行を最初に削除し、次に親レコードを削除します。失敗したときにロールバックする必要がある場合は、トランザクション内でこれを実行することをお勧めします。

また、外部キーに対してCASCADE ON DELETEを有効にすることもできます。このキーは、このシステムに適したものであれば自動的に子レコードを介して削除をカスケードします。

+0

CASCADE ON DELETE – SJMan

+0

の構文を教えてください。あなたは外部キーhttps ://msdn.microsoft.com/en-GB/library/ms188066.aspx – wizzardmr42

2

単一のクエリから複数のテーブルからレコードを削除することはできません。しかし、あなたはこの

  1. は、親/ヘッダテーブルのレコードを削除し、子またはマッピングテーブルからすべての関連レコードを削除し、 解決するには、2つの方法があります。 (ここでは複数のクエリが必要ですが、より良い制御のためにSQL Transactionを使用してください)。

  2. あるいは、ONは、テーブルスキーマでDELETE CASCADEを使用して、単一のクエリで削除し、必要な場合ON DELETE CASCADE

関連する問題