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

如何实现仅当T2中某ID所有行满足条件时删除T1对应行?

实现T1表的条件删除需求

场景与示例数据

表T1含ID列,表T2含与T1对应的FooID列,二者为1:n映射(T1一个ID对应T2多行),且该列未设外键。示例数据如下:

T1表

ID
42
43

T2表

FooID | Timestamp
42    | '2023-10-04T07:30:00'
42    | '2023-10-04T08:30:00'
43    | '2023-10-04T07:30:00'

需求

仅当T2中同一ID的所有行都满足Timestamp <= '2023-10-04T08:00:00'时,删除T1中对应的行。

当前问题

现有SQL语句会误删不符合要求的行:

DELETE foo 
FROM T1 foo
JOIN T2 bar ON foo.ID = bar.FooID
WHERE bar.TimeStamp <= '2023-10-04T08:00:00'

比如ID42,T2中虽有一行满足时间条件,但另一行超时,本不应删除,却被该语句误删。

可行解决方案

方案1:排除有超时行的ID

先筛选出T2中存在超时行的FooID,删除T1中不在此列表的ID:

DELETE FROM T1
WHERE ID NOT IN (
    SELECT DISTINCT FooID
    FROM T2
    WHERE Timestamp > '2023-10-04T08:00:00'
)

逻辑:只要T2中某ID有一行超时,就把该ID排除在删除范围外;剩下的ID就是所有关联行都符合时间条件的,执行删除。

方案2:分组判断最大时间

按FooID分组,判断分组内最大时间是否≤阈值,删除T1中符合该条件的ID:

DELETE FROM T1
WHERE ID IN (
    SELECT FooID
    FROM T2
    GROUP BY FooID
    HAVING MAX(Timestamp) <= '2023-10-04T08:00:00'
)

逻辑:如果某FooID对应的所有T2行中,最大的时间都不超过阈值,说明所有行都符合条件,删除T1中对应的ID。

结果验证

针对示例数据:

  • ID42的T2行存在超时记录,两种方案都不会删除它;
  • ID43的所有T2行都符合时间条件,会被正确删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:15:16