You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle中基于合格ID集删除Final_Table中不在Latest_Table内的行的SQL语句优化需求

修正Oracle Delete语句以满足指定ID的删除需求

Got it,我来帮你搞定这条删除语句的问题~先说说你原来的SQL哪里出了问题:

当FT.ID不在Sample_Table里时(比如示例中的ID=2),你的子查询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会返回空结果,这时候NOT EXISTS就会判定为真,导致这些ID的行被误删——这正好违背了你的需求。

正确的思路是先锁定Sample_Table中的合格ID,只在这个范围内删除那些不在Latest_Table里的行,下面给你两种可行的修正方案:

方案一:用IN限定合格ID范围

DELETE FROM FINAL_TABLE FT
WHERE FT.ID IN (SELECT ID FROM Sample_Table) -- 先筛选出需要处理的ID
  AND NOT EXISTS (
    SELECT 1 
    FROM Latest_Table LT
    WHERE LT.ID = FT.ID 
      AND LT.SUB_ID = FT.SUB_ID
  );

方案二:用双重EXISTS逻辑判断

DELETE FROM FINAL_TABLE FT
WHERE EXISTS (
    SELECT 1 
    FROM Sample_Table ST
    WHERE ST.ID = FT.ID -- 确认当前行属于合格ID
)
AND NOT EXISTS (
    SELECT 1 
    FROM Latest_Table LT
    WHERE LT.ID = FT.ID 
      AND LT.SUB_ID = FT.SUB_ID -- 确认当前行不在Latest_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

这两种方案的核心都是先把操作范围限定在Sample_Table的合格ID内,再删除那些不在Latest_Table里的对应行,这样就不会碰那些不在合格列表里的ID(比如ID=2)的数据啦。

内容的提问来源于stack exchange,提问作者Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 13:04:06