質問: a2.itemno and to_char(last_day(add_months(sysdate,-4)),'yyyymmdd') < to_char(a2.createdate,'yyyymmdd')) and not exists(select 'x' from tablec c where a.itemno != c.itemno and to_char(last_day(add_months(sysdate,-4)),'yyyymmdd') < to_char(a.createdate,'yyyymmdd')) 上記のselect文の後に処理されるdelete文は 「select 複数の項目 from tablea a」 ⇒ delete from tablea a としたもので、 条件は全てselect文と同様のものを使用しています。 ◆条件を言葉で明記すると以下のようになります。 1.bテーブルに存在するものは削除対象外とする 2.aテーブルのアイテムidとcテーブルのアイテムidは一致する。 aテーブルのcreatedateとcテーブルのrepymdのいずれかが3ヶ月以内のアイテムは 削除対象外とする 3.aテーブルもしくはcテーブルにしか存在しない場合は、各日付が3ヶ月以内のアイテムは 削除対象外とする 以上のようになっています。 どなたかアドバイスをいただければ幸いです。 宜しくお願い致します。
回答: 各テーブルの件数、主キー、索引の有無、select文の実行計画がわからないのでなんとも言えませんが、何らかの理由でselectとdeleteで異なる実行計画が採用されている可能性があります。 もし、tableaに主キーがあるなら、そのデータを抽出し、in句を使ってdeleteを実行してみてください。