SQL多条件关联另一表查询数据避免主表出现重复记录的实现方案
问题根因
你当前使用的语句存在两个核心问题:
- 虽然写了LEFT JOIN,但WHERE子句中添加了
b.status = 'success'的过滤条件,会自动把没有匹配到success记录的t1行过滤掉,实际等价于INNER JOIN - 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;
预期输出
按照你提供的测试数据,执行以上任意语句后得到的结果如下:
| id | trx_id | status |
|---|---|---|
| 1 | trx1234 | success |
内容的提问来源于stack exchange,提问作者EgeekC
相关产品推荐
相关产品推荐

