こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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
)
;

投稿日時 - 2010-03-16 12:21:33

QNo.5756216

困ってます

質問者が選んだベストアンサー

まず、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);

でどうでしょか?

投稿日時 - 2010-03-16 14:39:20

お礼

ご回答ありがとうございます。
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:03

ANo.2

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

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
みたいな書式は互換性が乏しいので、
如何なものかと・・・

投稿日時 - 2010-03-16 14:53:14

ANo.1

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
かもしれませんが。

投稿日時 - 2010-03-16 13:26:38

お礼

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

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

投稿日時 - 2010-03-16 14:49:19

あなたにオススメの質問