Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Löschen von Zeilen aus übergeordneten und untergeordneten Tabellen

Zwei mögliche Ansätze.

  1. Wenn Sie einen Fremdschlüssel haben, deklarieren Sie ihn als on-delete-cascade und löschen Sie die übergeordneten Zeilen, die älter als 30 Tage sind. Alle untergeordneten Zeilen werden automatisch gelöscht.

  2. Basierend auf Ihrer Beschreibung sieht es so aus, als ob Sie die übergeordneten Zeilen kennen, die Sie löschen möchten, und die entsprechenden untergeordneten Zeilen löschen müssen. Haben Sie SQL so ausprobiert?

      delete from child_table
          where parent_id in (
               select parent_id from parent_table
                    where updd_tms != (sysdate-30)
    

    -- Löschen Sie jetzt die Datensätze der übergeordneten Tabelle

    delete from parent_table
    where updd_tms != (sysdate-30);
    

---- Basierend auf Ihren Anforderungen sieht es so aus, als müssten Sie möglicherweise PL/SQL verwenden. Ich werde sehen, ob jemand eine reine SQL-Lösung dazu posten kann (in diesem Fall wäre das definitiv der richtige Weg).

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