Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Excluindo linhas de tabelas pai e filho


Duas abordagens possíveis.

  1. Se você tiver uma chave estrangeira, declare-a como on-delete-cascade e exclua as linhas pai com mais de 30 dias. Todas as linhas filhas serão excluídas automaticamente.

  2. Com base na sua descrição, parece que você conhece as linhas pai que deseja excluir e precisa excluir as linhas filhas correspondentes. Você já tentou SQL assim?
      delete from child_table
          where parent_id in (
               select parent_id from parent_table
                    where updd_tms != (sysdate-30)
    

    -- agora exclui os registros da tabela pai
    delete from parent_table
    where updd_tms != (sysdate-30);
    

---- Com base em seus requisitos, parece que você pode precisar usar PL/SQL. Vou ver se alguém pode postar uma solução SQL pura para isso (nesse caso, esse seria definitivamente o caminho a seguir).
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;
/