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

SQL两表关联:查询无t2日期匹配区间的对应ID

原有SQL问题排查
  • 字段引用完全错误:t1表不存在date字段,原SQL子查询中错误引用t1.date,同时还把t1独有的current_date、previous_date字段安到了t2表上,逻辑从根上写反。
  • 关联逻辑冗余低效:原SQL用INNER JOIN强行关联t1和t2,会先对两表同id数据做笛卡尔积,数据量稍大就会产生海量无效中间结果,这是查询长时间跑不出结果的核心原因。实际上这个需求根本不需要先把两表全量关联。
  • 子查询逻辑完全错位:NOT EXISTS的判断目标本应是「当前t1区间内不存在同id的t2日期点」,原SQL的子查询既没有正确关联外层t1记录,判断对象也错写成了t1表的数据,完全不匹配需求。
正确实现方案

核心逻辑是逐行检查t1的每一条日期区间,只要某条区间下,同id的t2表没有任何日期落在区间范围内,就返回对应的id,加DISTINCT是为了避免同一个id存在多个符合条件的区间时返回重复结果。

SELECT DISTINCT t1.id
FROM t1
WHERE NOT EXISTS (
    SELECT 1
    FROM t2
    WHERE t2.id = t1.id
      -- 闭区间判断,如果不需要包含区间端点,可改成>和<的比较逻辑
      AND t2.`date` BETWEEN t1.previous_date AND t1.current_date
);

如果你的表中可能存在previous_date大于current_date的脏数据,可以把区间判断改成鲁棒性更强的写法,自动识别两个日期的大小:

AND t2.`date` BETWEEN LEAST(t1.previous_date, t1.current_date) AND GREATEST(t1.previous_date, t1.current_date)
样例匹配验证

基于给出的测试数据运行上述SQL,执行逻辑如下:

  • id=1共有两条区间:第一条2021-09-25至2021-09-28,t2存在2021-09-27落在区间内,不满足条件;第二条2021-10-25至2021-10-27,同id的t2无任何日期落在区间内,满足条件,id=1会被纳入结果集。
  • id=2共有一条区间2021-01-01至2021-01-05,t2存在2021-01-03落在区间内,不满足条件,不会被纳入结果集。
    最终返回结果和预期完全一致,为id=1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:24:15