/ sqlserver2005で単一のクエリを使用して一度に複数のテーブルからレコードを削除/削除 - sql-server-2005、delete-row

sqlserver2005の単一のクエリで一度に複数のテーブルからレコードを削除する - sql-server-2005、delete-row

1回のクエリで、子テーブルと親テーブルからレコードを削除したいのですが。下記のクエリを見つけてください。ここでは応答ヘッダーが主テーブルで、responseidが主キーです。

DELETE FROM responseheader
FROM responseheader
INNER JOIN responsepromotion ON responseheader.responseid = responsepromotion.ResponseID
INNER JOIN responseext ON responsepromotion.ResponseID=responseext.ResponseID
WHERE responseheader.responseid In ("67D8B9E8-BAD2-42E6-BAEA-000025D56253")

しかし、そのスローエラー。誰かが私に正しい質問を見つけるのを手伝ってくれる?

回答:

回答№1の場合は3

ある種のカスケード削除を使用しない限り、単一のdeleteステートメントは単一のテーブルから行を削除します。

あなたの例では、構文が正しければ、あなたはそこから行を削除するでしょう。 responseheader 残りの表は、どの行から削除するのかを決定するためだけに使用されます。 responseheader.

鈍くするには 本当に カスケード削除を使用したくないので、各テーブルに1つずつ、複数のdeleteステートメントを実行する必要があります。


回答№2の場合は0

ストアドプロシージャを作成し、そのストアドプロシージャを呼び出して削除することもできます。次のように、sp_executesqlを使用してバッチクエリを一度に送信することもできます。

sp_executesql

"DELETE FROM responsepromotion
FROM responsepromotion
INNER JOIN responseheader ON responseheader.responseid = responsepromotion.ResponseID
WHERE responseheader.responseid = @guid;

DELETE FROM responseext
FROM responseext
INNER JOIN responseheader ON responsepromotion.ResponseID=responseext.ResponseID
WHERE responseheader.responseid = @guid;

DELETE FROM responseheader
WHERE responseid = @guid;",

@guid = "67D8B9E8-BAD2-42E6-BAEA-000025D56253"

回答№3の場合は0

ラッセカスケード削除で述べたように、唯一のものです単一の照会で複数の表から削除するオプション。そのためには、外部キーを設定してマスターテーブルのエントリを削除する必要があります。そこに子テーブルの行が削除されます。しかし、それは使用されていません。複数のdeleteステートメントを使用することをお勧めします。自動コミットをfalseに設定してトランザクションを使用することもできます。その後、行を削除し、必要に応じて手動でコミットまたはロールバックします。