2つの可能なアプローチ。
-
外部キーがある場合は、それをon-delete-cascadeとして宣言し、30日より古い親行を削除します。すべての子行が自動的に削除されます。
-
説明に基づくと、削除する親行がわかっていて、対応する子行を削除する必要があるようです。このようなSQLを試しましたか?
delete from child_table where parent_id in ( select parent_id from parent_table where updd_tms != (sysdate-30)
-ここで、親テーブルレコードを削除します
delete from parent_table where updd_tms != (sysdate-30);
----要件に基づいて、PL/SQLを使用する必要があるようです。誰かがこれに純粋なSQLソリューションを投稿できるかどうかを確認します(その場合、それは間違いなく進むべき道です)。
declare
v_sqlcode number;
PRAGMA EXCEPTION_INIT(foreign_key_violated, -02291);
begin
for v_rec in (select parent_id, child id from child_table
where updd_tms != (sysdate-30) ) loop
-- delete the children
delete from child_table where child_id = v_rec.child_id;
-- delete the parent. If we get foreign key violation,
-- stop this step and continue the loop
begin
delete from parent_table
where parent_id = v_rec.parent_id;
exception
when foreign_key_violated
then null;
end;
end loop;
end;
/