2017-03-28 27 views
2

次の条件を試しています。LoansテーブルのLoanにOutstandingAmount <がある場合は、データベース内のすべての関連情報を削除します。私は、単一のコマンドでそれをしなければならない、したがって、私は内部結合を使用してみましたが :DELETEでINNER JOINを使用する

DELETE A, B, C, D, E 
FROM Loans AS T1 
INNER JOIN Payments T2 ON T1.LoanID = T2.LoanID 
INNER JOIN Repayments T3 ON T1.LoanID = T3.LoanID 
INNER JOIN Histories T4 ON T1.LoanID = T4.LoanID 
INNER JOIN LoanRequests T5 ON T1.RequestDate = T5.RequestDate AND T1.BID = T5.BID 
INNER JOIN Commits T6 ON T1.RequestDate = T6.requestDate AND T1.BID = T6.BID 
WHERE T1.OutstandingAmount < 0 

ただし、このコマンドは「A、BをDELETE」私の構文エラーになりますし、私もわからないんだけどこれは動作しますか? ご協力いただければ幸いです。ありがとうございました。

+8

、あなたは一度に1つのテーブルからしか削除できません。代わりにカスケードする外部キーの関係が必要なのかもしれません。 –

+0

またはマジックテーブルを使用してください(冗談、google it) – Veljko89

+1

A、B、C、D、Eとは何ですか?彼らはテーブルではありません...彼らは列ですか? – asemprini87

答えて

4

ゴードン・リノフがコメントに書いたように、各削除ステートメントの1つのテーブルからしか削除できません。

あなたは基本的に2つのオプションがあります:

  1. あなたの外部キーでON DELETE CASCADEを使用(それはおそらく行うための最善の ことだ)

  2. 各テーブルのDELETEステートメントを使用しますが、ラップをトランザクション内の削除プロセス全体。

あなたの外部キーにON DELETE CASCADEを追加すると、ドロップを意味して再作成それら:

ALTER TABLE dbo.Loans 
DROP CONSTRAINT FK_Loans_Payments; 

ALTER TABLE dbo.Loans 
ADD CONSTRAINT FK_Loans_Payments FOREIGN KEY (LoanID) REFERENCES Payments(LoanID) ON DELETE CASCADE; 

を個々のDELETE文をラップするトランザクションを使用した:SQL Serverでの

BEGIN TRASACTION 

BEGIN TRY 

DELETE c 
FROM Commits 
INNER JOIN Loans l ON l.RequestDate = c.RequestDate 
WHERE l.OutstandingAmount < 0 

DELETE lr 
FROM LoanRequests lr 
INNER JOIN Loans l ON l.RequestDate = lr.RequestDate 
WHERE l.OutstandingAmount < 0 

-- more of the same... 

DELETE 
FROM Loans 
WHERE OutstandingAmount < 0 

COMMIT TRANSACTION 

END TRY 
BEGIN CATCH 

    IF @@TRANCOUNT > 0 
     ROLLBACK TRANSACTION 
END CATCH 
+0

ありがとうございます。私は両方の方法(ON DELETE CASCADEとTRANSACTION)を採用しました。 ON DELETE CASCADEを使用すると、DELETEステートメントを2に減らし、TRANSACTIONに挿入することに成功しました。できます !!もう一度ありがとうございます。 –

+0

[喜んで: - )](http://meta.stackoverflow.com/questions/291325/how-to-show-appreciation-to-a-user-on-stackoverflow/291327#291327) –