2

2 つの異なるテーブルから同時に行を削除しようとしています。テーブルは次のようになります。

TABLE - Value
-----------
ID
Field
<some other stuff...>

TABLE - Srch
-----------
Value_ID
Srch_ID
<some other stuff...>

VALUEwhere fieldis equal to 'SUCCESS'からすべての行を削除しようとしています。また、を通じてSRCHリンクされている行も削除しようとしています。には、同じ を持つ行が複数ある場合があります。VALUEvalue_idSRCHvalue_id

この SQL ステートメントはどのようになりますか?

4

3 に答える 3

5

2 つのテーブルと の間で外部キーを使用することをお勧めしますON DELETE CASCADE。したがって、Value の行を削除するだけで、Srch の対応するすべての行が削除されます。

データベースに次の制約を追加できます。

ALTER TABLE Srch ADD CONSTRAINT
FK_Value_ID FOREIGN KEY(Value_ID)
REFERENCES Value (ID) 
ON DELETE CASCADE;

明確にするために(xQbertコメントからの引用):値からのIDが削除されると、「カスケードは常に発生します」。

于 2012-06-14T14:09:52.460 に答える
3

これを自動的に行うようにデータベースを変更するのが理想的ですが、これが常に必要な動作であり、データベースに対するアクセス許可がある場合はそうすることができます。

それ以外の場合、特にこれが1回限りまたは時折発生する場合は、2つの単純なクエリのセットで実行できます。一緒に実行します。

Delete from Srch where value_id in (Select ID from value where field='SUCCESS')
Delete from value where field='SUCCESS'

これが稼働中のシステムである場合は、これらを単一のトランザクションの一部として実行して、2つのステートメントの間に値が更新されないようにし、孤立したものなどを残します。正しい分離レベルで実行する場合、これはこれを行うための最も簡単で簡単な方法になります。

于 2012-06-14T14:25:51.080 に答える
0

または、PL / SQLを使用するが外部キーを使用しない、より複雑なソリューション:

DEFINE 
v_success_count number;
v_val_id number;
BEGIN

SELECT INTO v_success_count count(*) FROM


WHILE (select count(*) FROM value WHERE field = 'SUCCESS') > 0
LOOP
    SELECT value_id INTO val_id FROM value WHERE field = 'SUCCESS' AND rownum = 1;

    DELETE FROM srch WHERE value_id = v_val_id;

    DELETE FROM value WHERE field = 'SUCCESS' AND rownum = 1;
END LOOP
COMMIT;
END;
于 2012-06-14T14:20:41.333 に答える