アプリ版:「スタンプのみでお礼する」機能のリリースについて

DELETE 文とEXISTSの使い方について(Oracle10g)

2つのテーブル(A、B)を外部結合して、B側がNULLとなったレコードを
A側から削除する、というDELETE文が作りたいのですが、
EXISTS句を使ってみたもののどうも使い方がわからず苦戦しています。

目的は2つのテーブルを同期させる事で
このSQLを実行する時点で、常にA>Bになっています。

目的を達成できるSQLを教えてください。

<削除対象レコードをSELECTするSQL>
SELECT *
FROM A,
B
WHERE A.KEY1 = B.KEY1(+)
AND A.KEY2 = B.KEY2(+)
AND B.KEY1 IS NULL
;

<上をDELETE文にしてみたつもりが、削除0件になってしまうSQL>
DELETE FROM A
WHERE EXISTS(
SELECT 1
FROM B
WHERE A.KEY1 = B.KEY1(+)
AND A.KEY2 = B.KEY2(+)
AND B.KEY1 IS NULL
)
;

A 回答 (3件)

まず、select文について質問です。


※の行はテーブルを結合する上で必要ですか?

<削除対象レコードをSELECTするSQL>
SELECT *
FROM A,
B
WHERE A.KEY1 = B.KEY1(+)
AND A.KEY2 = B.KEY2(+) ←※
AND B.KEY1 IS NULL

必要がないようでしたら、

DELETE FROM A
WHERE NOT EXISTS (SELECT * FROM B WHERE A.KEY1 = B.KEY1);

でどうでしょか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
NOT EXISTSは盲点でした。
B.KEY2は必要なため、少し加工して目的の結果が得られました。

DELETE FROM A
WHERE NOT EXISTS
(SELECT * FROM B WHERE A.KEY1 = B.KEY1 AND A.KEY2 = B.KEY2);

お礼日時:2010/03/16 14:46

DELETE A


FROM A LEFT JOIN B
ON A.KEY1 = B.KEY1
AND A.KEY2 = B.KEY2
WHERE B.KEY1 IS NULL

こんな感じのような気がします。
お試しあれ。

A.KEY1 = B.KEY1(+)
とか
A.KEY1 =* B.KEY1
みたいな書式は互換性が乏しいので、
如何なものかと・・・
    • good
    • 0

DELETE FROM A


WHERE A.KEY1 = (
SELECT A.KEY1
FROM A,
B
WHERE A.KEY1 = B.KEY1(+)
AND A.KEY2 = B.KEY2(+)
AND B.KEY1 IS NULL
)
;

こうでどうでしょう?
A.KEY1 =
より
A.KEY1 IN
かもしれませんが。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

言葉足らずでしたが、DELETE行を特定するには、
KEY1,KEY2 ともに必要です。
そのため、IN(副問合せ)では、KEY1 || KEY2 とする
必要があり、結果を得れましたがパフォーマンスが出ずに
断念しました。

お礼日時:2010/03/16 14:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す