首页 > 解决方案 > 通过仅选择符合条件的记录从表中删除其他表中不存在的行

问题描述

我正在使用甲骨文。我需要删除一个表中不存在于其他表中的行,方法是将其与只有合格 ID 的表连接起来。对不起,我不知道如何更好地解释它。下面是一个例子。ID + SUB_ID 是PK

Final_table - 
ID SUB_ID  Name
1  1       Football
1  2       Cricket
1  3       Formula1
1  4       Tennis
2  1       Hockey
2  2       Archery
2  3       Badminton
3  1       Basketball
3  2       Dodgeball 

Latest_Table
ID SUB_ID  Name
1  1       Football
1  2       Cricket
1  3       Formula1
2  1       Hockey
2  2       Archery
3  1       Basketball

Sample_Table
ID
1
3

从上面的示例中,我在 ID 列上加入了带有 Sample_Table 的 Latest_table,它给了我 ID (1,3)。现在基于这些符合条件的ID,我想从Final_Table 中删除Latest_Table 中不存在的行。我不希望它删除 ID=2 的任何内容,因为它不符合条件。我写了下面的代码,但它正在从 FINAL_TABLE 中删除所有最新表中不存在的内容。

Delete from FINAL_TABLE FT
where not exists 
(select 1 from 
Latest_table LT, Sample_table ST
where LT.ID = ST.ID
and LT.ID = FT.ID
and LT.SUB_ID = FT.SUB_ID);

谢谢您的帮助。

已编辑 - Final_Table 中所需的结果应如下所示

Final_table - 
ID SUB_ID  Name
1  1       Football
1  2       Cricket
1  3       Formula1
2  1       Hockey
2  2       Archery
2  3       Badminton
3  1       Basketball

标签: oraclejoinnot-exists

解决方案


编辑:我最初误读了您的查询。我已经改变了我的答案,在第一个条件下删除了对 Sample_Table 的连接。

Delete from FINAL_TABLE FT
where not exists 
(select 1 from 
Latest_table LT
where LT.ID = FT.ID
and LT.NAME = FT.NAME
and LT.SUB_ID = FT.SUB_ID)
AND FT.id IN
(
 SELECT id FROM Sample_Table
)

如果 id 出现在 Sample_Table 中并且记录(所有 3 列)没有出现在 Latest_table 中,这只会从 Final_Table 中删除。

另一种写法是

Delete from FINAL_TABLE FT
where 
  (FT.ID, FT.SUB_ID, FT.NAME) NOT IN
   (SELECT LT.ID, LT.SUB_ID, LT.NAME FROM Latest_table LT)
 AND FT.ID IN
  (SELECT ST.id FROM Sample_Table ST)

推荐阅读