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

MySQL关联查询筛选rdt_date小于dt_date的记录出现重复如何解决

MySQL关联查询重复记录问题解决

重复原因

你遇到的重复是关联逻辑的正常结果:sampleInspect和sampleRec两张表中,同一个idno都存储了多条时间记录,只要两条记录满足i.rdt_date < r.dt_date的关联条件,就会生成一条匹配结果,因此同一个sampleInspect的记录可能对应多条sampleRec的记录,最终出现重复。

适配不同需求的解决方案

场景1:每个sampleInspect记录只匹配最近的符合条件的dt_date

这是最常用的业务场景,仅保留每个检验记录对应的、大于检验时间的最早录入记录,避免一对多匹配产生重复:

SELECT dt_date, idno2, idno, rdt_date
FROM (
    SELECT 
        r.dt_date, 
        r.idno AS idno2, 
        i.idno, 
        i.rdt_date,
        ROW_NUMBER() OVER(PARTITION BY i.idno, i.rdt_date ORDER BY r.dt_date ASC) AS rn
    FROM sampleInspect i
    INNER JOIN sampleRec r 
        ON r.idno = i.idno 
        AND i.rdt_date < r.dt_date
    WHERE i.rdt_date BETWEEN '2021-1-1' AND '2021-11-17'
) t
WHERE rn = 1;

场景2:仅需要去重完全相同的结果行

如果你的业务允许保留所有匹配结果,仅需要去除完全重复的行,直接加DISTINCT关键字即可:

SELECT DISTINCT r.dt_date, r.idno as idno2, i.idno, i.rdt_date
FROM  sampleInspect i
INNER JOIN sampleRec r 
    ON r.idno = i.idno 
    AND i.rdt_date < r.dt_date
WHERE i.rdt_date BETWEEN '2021-1-1' AND '2021-11-17'

场景3:仅判断是否存在符合条件的记录,不需要返回dt_date

如果不需要展示sampleRec的时间字段,用EXISTS查询效率更高,完全不会产生重复:

SELECT i.idno, i.rdt_date
FROM sampleInspect i
WHERE i.rdt_date BETWEEN '2021-1-1' AND '2021-11-17'
AND EXISTS (
    SELECT 1 FROM sampleRec r 
    WHERE r.idno = i.idno AND r.dt_date > i.rdt_date
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:15:07