MySQL 5.6关联两张表时如何排除错误冗余行
解决方案:MySQL 5.6 下无窗口函数的时间序列匹配
针对你的场景,由于MySQL 5.6不支持RANK()等窗口函数,且只有只读权限,我们可以通过自连接生成序号的方式,把T1的开始时间和T2的结束时间按顺序一一匹配,得到你需要的3行结果。
预期正确结果
| Employee_ID | Work_START | Work_END |
|---|---|---|
| 1111 | 10 Nov | 12 Nov |
| 1111 | 14 Nov | 15 Nov |
| 1111 | 18 Nov | 20 Nov |
实现SQL
SELECT t1_seq.Employee_ID, t1_seq.Work_START, t2_seq.Work_END FROM ( -- 给T1的每个开始时间按员工分组生成序号 SELECT Employee_ID, Work_START, (SELECT COUNT(*) FROM T1 t1_inner WHERE t1_inner.Employee_ID = t1_outer.Employee_ID AND t1_inner.Work_START <= t1_outer.Work_START) AS seq FROM T1 t1_outer ) t1_seq INNER JOIN ( -- 给T2的每个结束时间按员工分组生成序号 SELECT Employee_ID, Work_END, (SELECT COUNT(*) FROM T2 t2_inner WHERE t2_inner.Employee_ID = t2_outer.Employee_ID AND t2_inner.Work_END <= t2_outer.Work_END) AS seq FROM T2 t2_outer ) t2_seq ON t1_seq.Employee_ID = t2_seq.Employee_ID AND t1_seq.seq = t2_seq.seq WHERE t2_seq.Work_END > t1_seq.Work_START;
逻辑说明
- 生成序号:通过自连接子查询,统计每个时间点之前(包含自身)的同员工时间记录数,以此作为排序后的序号,确保同员工的
Work_START和Work_END都按时间顺序排列。 - 按序号关联:用生成的序号将T1和T2的记录一一对应,再通过
Work_END > Work_START的条件过滤掉不符合逻辑的匹配。 - 权限兼容:整个查询仅使用基础的SELECT和JOIN操作,不需要创建索引、执行SET命令或使用高版本窗口函数,完全适配只读权限和MySQL 5.6的限制。
内容的提问来源于stack exchange,提问作者Ganesh
相关产品推荐
相关产品推荐

