删除两个连接表

时间:2016-03-22 09:16:44

标签: sql oracle11g sql-delete jointable

我有两张NOTIF和PJ_GEN这样定义的表:

TABLE NOTIF
==========
ID_NOTIF
COD_ONE
LIB
DATE

TABLE PJ_GEN
==========
ID_PJ
COD_TWO
LIB_TWO

这个表定义了多对多的关联:

PJ_BY_NOTIF
==========
ID_NOTIF
ID_PJ

我想写一个删除所有表的请求,从NOTIF表开始。我的基本要求是:

DELETE * FROM NOTIF WHERE DATE < ? AND COD_ONE = 3;

如何更新此请求两次删除已连接的表PJ_GEN和PJ_BY_NOTIF?

PJ_BY_NOTF有两个外键:ID_NOTIFID_PJ

解决方案:

我找到了一种方法,在on delete cascade

中的ID_PJ外键上添加PJ_BY_NOTIF

1 个答案:

答案 0 :(得分:0)

在这种情况下,您可以先使用PJ_GEN加入NOTIF的条件从PJ_BY-NOTIF表中删除 喜欢

Delete from PJ_GEN where ID_PJ in 
          (select ID_PJ from PJ_BY_NOTIF ,NOTIF 
                       where NOTIF.ID_NOTIF = PJ_BY_NOTIF.ID_NOTIF
                       and NOTIF.DATE < ? AND COD_ONE = 3);

然后您可以发出一个删除语句从PJ_BY_NOTIF表中删除以删除多对多关联

DELETE from PJ_BY_NOTIF WHERE ID_PJ IN 
                     ( SELECT ID_PJ 
                        FROM NOTIF 
                         WHERE NOTIF.DATE < ? AND COD_ONE = 3);

编辑:如果中间表PJ_BY_NOTIF中存在外键,那么您需要确保已使用ON DELETE CASCADE约束定义外键,否则请执行这种变化。如果定义了ON DELETE CASCADE,那么这将自动从子表中删除相应的子记录,并且不需要使用第二个删除语句。

编辑2 - 但由于在这种情况下维持了多对多的关系,这会干扰与其他值的关系。 这意味着如果您有一个ID_PJ定义了两个ID_NOTIF,其中一个NOTIF将从主表中删除,因此您尝试根据您的条件从PJ_GEN中删除。但由于另一个ID_NOTIF也与此ID_PJ相关联,因此您应跳过此特定ID_PJ以从PJ_GEN表中删除。

然后从NOTIF表中删除。

DELETE FROM NOTIF 
WHERE NOTIF.DATE < ? AND COD_ONE = 3