sql >> Database >  >> RDS >> Oracle

Rijen verwijderen uit bovenliggende en onderliggende tabellen

Twee mogelijke benaderingen.

  1. Als u een externe sleutel heeft, declareert u deze als on-delete-cascade en verwijdert u de bovenliggende rijen die ouder zijn dan 30 dagen. Alle onderliggende rijen worden automatisch verwijderd.

  2. Op basis van uw beschrijving lijkt het erop dat u de bovenliggende rijen kent die u wilt verwijderen en dat u de bijbehorende onderliggende rijen moet verwijderen. Heb je SQL op deze manier geprobeerd?

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

    -- verwijder nu de bovenliggende tabelrecords

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

---- Op basis van uw vereisten lijkt het erop dat u PL/SQL moet gebruiken. Ik zal kijken of iemand hier een pure SQL-oplossing voor kan posten (in dat geval zou dat zeker de beste keuze zijn).

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


  1. CONVERT() van datum/tijd naar tekenreeksvoorbeelden in SQL Server

  2. hoe de volledige opgeslagen procedurecode weer te geven?

  3. Maak een tabel van twee typen in PostgreSQL

  4. Hoe converteer ik een tijdstempel naar een datum/tijd in MySQL?