编写T-SQL语句查询每个EmpId未出现在T2中的T1对应日期
T-SQL多表差集查询问题解决方案
基础信息
涉及表结构及样例数据
- T1:存储全量日期列表
DateList 2021-11-06 2021-11-07 2021-11-08 2021-11-09
- T2:存储员工ID与对应的申请日期
EmpId ApplyDate 1 2021-11-07 1 2021-11-09 2 2021-11-09
查询需求
获取每个员工ID对应的、未提交申请的T1日期,输出结果包含DateList、EmpId两列,预期输出如下:
DateList EmpId 2021-11-06 1 2021-11-08 1 2021-11-06 2 2021-11-07 2 2021-11-08 2
可用T-SQL实现语句
SELECT t1.DateList, e.EmpId FROM T1 t1 -- 生成所有员工与所有日期的全量组合 CROSS JOIN (SELECT DISTINCT EmpId FROM T2) e -- 过滤掉已有申请记录的组合 WHERE NOT EXISTS ( SELECT 1 FROM T2 t2 WHERE t2.EmpId = e.EmpId AND t2.ApplyDate = t1.DateList ) -- 可选:按员工ID、日期排序匹配预期输出顺序 ORDER BY e.EmpId, t1.DateList
实现逻辑说明
- 先通过
CROSS JOIN得到全量的「员工-日期」配对,确保每个员工都和T1的所有日期完成关联 - 再通过
NOT EXISTS子句剔除该员工已经在T2中存在申请记录的日期,剩下的就是符合要求的结果 - 语句兼容所有SQL Server版本,执行效率较高,不需要额外的复杂关联操作
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

