在不同筛选条件下查找另一张表中缺失的日期
匹配Ref#查找跨表不存在的日期解决方案
1. 查找Table1(Yellow)中存在、Table2(同Ref#的Pink)中不存在的日期
用NOT EXISTS精准匹配Ref#和Date,同时限定筛选条件:
SELECT t1.Ref#, t1.Date FROM Table1 t1 WHERE t1.criteria = 'Yellow' AND NOT EXISTS ( SELECT 1 FROM Table2 t2 WHERE t2.Ref# = t1.Ref# AND t2.Criteria = 'Pink' AND t2.Date = t1.Date );
你的示例数据里,此查询返回空结果——因为Table1的所有Yellow日期在Table2的Pink数据中都存在。
2. 查找Table2(Pink)中存在、Table1(同Ref#的Yellow)中不存在的日期
同样使用NOT EXISTS:
SELECT t2.Ref#, t2.Date FROM Table2 t2 WHERE t2.Criteria = 'Pink' AND NOT EXISTS ( SELECT 1 FROM Table1 t1 WHERE t1.Ref# = t2.Ref# AND t1.criteria = 'Yellow' AND t1.Date = t2.Date );
针对你的示例数据,这个查询会返回:
Ref# Date abc123 05/02/1990
3. 左连接替代写法
如果更习惯左连接逻辑,可以用以下语句实现场景2的需求:
SELECT t2.Ref#, t2.Date FROM Table2 t2 LEFT JOIN Table1 t1 ON t1.Ref# = t2.Ref# AND t1.criteria = 'Yellow' AND t1.Date = t2.Date WHERE t2.Criteria = 'Pink' AND t1.Ref# IS NULL;
原理是将Table2的Pink数据与Table1的Yellow数据按Ref#和Date关联,关联失败(t1.Ref# IS NULL)的记录就是Table1中不存在的日期,结果与NOT EXISTS写法一致。
4. 同时获取两边的缺失日期
如果需要一次性得到两张表互相缺失的日期,可以用UNION ALL合并两个查询:
-- Table1有但Table2没有的日期 SELECT t1.Ref#, t1.Date, 'Missing in Pink' AS status FROM Table1 t1 WHERE t1.criteria = 'Yellow' AND NOT EXISTS ( SELECT 1 FROM Table2 t2 WHERE t2.Ref# = t1.Ref# AND t2.Criteria = 'Pink' AND t2.Date = t1.Date ) UNION ALL -- Table2有但Table1没有的日期 SELECT t2.Ref#, t2.Date, 'Missing in Yellow' AS status FROM Table2 t2 WHERE t2.Criteria = 'Pink' AND NOT EXISTS ( SELECT 1 FROM Table1 t1 WHERE t1.Ref# = t2.Ref# AND t1.criteria = 'Yellow' AND t1.Date = t2.Date );
关键注意事项
- 确保
Date字段的类型/格式完全一致,避免因隐式转换导致匹配失败 - 若存在多个
Ref#,上述查询会自动按每个Ref#分别匹配,无需额外处理
内容的提问来源于stack exchange,提问作者Ben Ford
相关产品推荐
相关产品推荐

