gpt4 book ai didi

sql - 从父表和子表中删除行

转载 作者:行者123 更新时间:2023-12-04 13:15:02 25 4
gpt4 key购买 nike

假设 Oracle 10G 中有两个表

TableA (Parent) --> TableB (Child)

TableA 中的每一行在 TableB 中都有几个与其相关的子行。

我想删除 TableA 中的特定行,这意味着我必须先删除 tableB 中的相关行。

这将删除子条目
delete from tableB where last_update_Dtm = sysdate-30;

要删除刚刚在子表中删除的行的父行,我可以执行以下操作
Delete from TableA where not exists (select 1 from tableB where tableA.key=tableB.key);

上述内容还将删除子表中 (last_update_Dtm = sysdate-30) 为假的行。 TableA 没有 last_update_dtm 列,因此如果没有子表中的条目,就无法知道要删除哪些行。

我可以在删除之前将键保存在子表中,但这似乎是一种昂贵的方法。删除两个表中行的正确方法是什么?

编辑

为了更好地解释我想要实现的目标,如果两个表之间没有约束,以下查询将完成我想要做的事情。
Delete from tableA
Where exists (
Select 1 from tableB
where tableA.key=tableB.key
and tableB.last_update_dtm=sysdate-30)

Delete from tableB where last_update_dtm=systdate-30

最佳答案

两种可能的方法。

  • 如果您有外键,请将其声明为 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;
    /

    关于sql - 从父表和子表中删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5196261/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com