在 SQL 中,左右连接(LEFT/RIGHT JOIN)产生重复数据,根本原因在于 “一对多”或“多对多”的关联关系。即左表的一条记录,在右表中匹配到了多条记录。
针对不同的业务诉求,去重策略也完全不同。这里为你总结 4 种最实用的去重方案,按推荐度排序:
🥇 方案一:业务去重(窗口函数法)—— 最灵活、最推荐
适用场景:你需要关联右表的数据,但只需要右表中匹配到的“最新”或“最旧”或“指定优先级”的一条记录(比如:查所有用户及其最近的一笔订单)。
核心思想:先对右表进行排序去重(取 rn=1),再连接,彻底杜绝数据膨胀。
sql
SELECT a.*, b.order_id, b.amount FROM users a LEFT JOIN ( SELECT user_id, order_id, amount, ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY create_time DESC) AS rn FROM orders ) b ON a.id = b.user_id AND b.rn = 1;
优点:不仅去重,还完全控制了取哪条数据,性能最优(仅取一条)。
🥈 方案二:聚合去重(GROUP BY + 聚合函数)
适用场景:你需要关联右表,但最终目的是展现右表某些字段的汇总值(如:总金额、最大金额、计数)。
核心思想:先对右表按关联字段分组汇总,再用连接。
sql
SELECT