MySQL排除查询:筛选mainstage中不在main表的指定日期范围记录
解决方法:筛选mainstage中不在main表且modifiedDT在指定范围的记录
嗨,作为SQL新手不用紧张,这个需求其实挺常见的,咱们来一步步搞定它。你要的是从mainstage表中找出两类条件都满足的记录:一是modifiedDT落在你指定的日期区间里,二是这些记录的uniqueID在main表中完全找不到。下面给你几种实用且高效的实现方式,你可以根据自己的数据库类型和实际情况选择:
方法1:使用NOT EXISTS子查询(推荐)
这种写法逻辑最直观,而且在绝大多数数据库中性能表现都不错——尤其是当uniqueID字段有索引的时候,查询效率会很高。
SELECT * FROM mainstage ms WHERE ms.modifiedDT BETWEEN '你的开始日期' AND '你的结束日期' AND NOT EXISTS ( SELECT 1 FROM main m WHERE m.uniqueID = ms.uniqueID );
简单解释下:NOT EXISTS会逐条检查mainstage的记录,只要这条记录的uniqueID在main表中找不到匹配项,就会被保留下来,再加上modifiedDT的范围筛选,就得到了你要的结果。
方法2:使用LEFT JOIN + IS NULL
这是另一种经典的写法,通过左连接后筛选匹配失败的记录:
SELECT ms.* FROM mainstage ms LEFT JOIN main m ON ms.uniqueID = m.uniqueID WHERE ms.modifiedDT BETWEEN '你的开始日期' AND '你的结束日期' AND m.uniqueID IS NULL;
原理是:左连接会保留mainstage的所有记录,对于那些在main表中找不到对应uniqueID的记录,m.uniqueID会被设为NULL,我们只要筛选出这些NULL的记录就行。
方法3:使用NOT IN(注意避坑)
这种写法看起来最简洁,但有个需要注意的点:如果main表的uniqueID字段存在NULL值,NOT IN会直接返回空结果,所以用之前一定要确认main.uniqueID没有NULL。
SELECT * FROM mainstage WHERE modifiedDT BETWEEN '你的开始日期' AND '你的结束日期' AND uniqueID NOT IN (SELECT uniqueID FROM main);
额外小提示
- 记得把代码里的
'你的开始日期'和'你的结束日期'替换成实际的日期值,比如'2024-01-01'和'2024-06-30'。不同数据库的日期格式可能有细微差别,比如SQL Server可以用'20240101',MySQL用'2024-01-01'就没问题。 - 如果
modifiedDT字段包含时间部分(比如2024-01-01 14:30:00),用BETWEEN会只包含结束日期的00:00:00时刻。要是你想包含结束日期一整天的记录,可以改成:
比如modifiedDT >= '你的开始日期' AND modifiedDT < '你的结束日期+1天'modifiedDT >= '2024-01-01' AND modifiedDT < '2024-07-01',这样就能包含6月30日的所有时间了。
内容的提问来源于stack exchange,提问作者sax
相关产品推荐
相关产品推荐

