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

SQL多条件关联另一表查询数据避免主表出现重复记录的实现方案

问题根因

你当前使用的语句存在两个核心问题:

  1. 虽然写了LEFT JOIN,但WHERE子句中添加了b.status = 'success'的过滤条件,会自动把没有匹配到success记录的t1行过滤掉,实际等价于INNER JOIN
  2. t2中同一个trx_id存在多条status=success的记录,关联时会和t1的同一条记录匹配多次,最终产生重复行
可用解决方案

以下几种方案可根据你的实际业务需求选择:

方案1:t2先去重再关联

适合需要返回t2中相关字段的场景,先对t2符合条件的记录按trx_id去重,再关联就不会产生重复:

SELECT a.*, b.trx_id, b.status
FROM t1 a
INNER JOIN (
    SELECT DISTINCT trx_id, status 
    FROM t2 
    WHERE status = 'success'
) b ON a.trx_id = b.trx_id;

方案2:使用EXISTS子查询

适合不需要返回t2除状态外其他字段的场景,性能更优,天然不会产生重复行:

SELECT a.*, 'success' AS status
FROM t1 a
WHERE EXISTS (
    SELECT 1 
    FROM t2 b 
    WHERE a.trx_id = b.trx_id 
    AND b.status = 'success'
);

方案3:GROUP BY聚合去重

适合后续需要同时统计t2中其他聚合指标(比如success记录数)的场景:

SELECT a.*, MAX(b.status) AS status
FROM t1 a
INNER JOIN t2 b ON a.trx_id = b.trx_id
WHERE b.status = 'success'
GROUP BY a.id, a.trx_id;
预期输出

按照你提供的测试数据,执行以上任意语句后得到的结果如下:

idtrx_idstatus
1trx1234success

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:36:03