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

MySQL 5.6关联两张表时如何排除错误冗余行

解决方案:MySQL 5.6 下无窗口函数的时间序列匹配

针对你的场景,由于MySQL 5.6不支持RANK()等窗口函数,且只有只读权限,我们可以通过自连接生成序号的方式,把T1的开始时间和T2的结束时间按顺序一一匹配,得到你需要的3行结果。

预期正确结果

Employee_IDWork_STARTWork_END
111110 Nov12 Nov
111114 Nov15 Nov
111118 Nov20 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;

逻辑说明

  1. 生成序号:通过自连接子查询,统计每个时间点之前(包含自身)的同员工时间记录数,以此作为排序后的序号,确保同员工的Work_START和Work_END都按时间顺序排列。
  2. 按序号关联:用生成的序号将T1和T2的记录一一对应,再通过Work_END > Work_START的条件过滤掉不符合逻辑的匹配。
  3. 权限兼容:整个查询仅使用基础的SELECT和JOIN操作,不需要创建索引、执行SET命令或使用高版本窗口函数,完全适配只读权限和MySQL 5.6的限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:30:53