2

単一のクエリで子テーブルと親テーブルからレコードを削除したいと思います。以下のクエリを見つけてください。ここで、responseヘッダーはプライマリテーブルであり、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')

しかし、そのスローエラー。誰かが正しいクエリを見つけるのを手伝ってくれますか

4

3 に答える 3

3

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

あなたの例では、構文が正しければ、からresponseheaderのみ行を削除し、残りのテーブルは、から削除する行を決定するためにのみ使用されresponseheaderます。

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

于 2010-04-23T06:14:15.243 に答える
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'
于 2010-04-23T06:40:06.237 に答える
0

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

于 2010-04-23T06:43:07.773 に答える