SQL使用LEFT JOIN查询返回重复值 如何获取唯一结果
问题根因
返回重复结果是因为JOIN写法存在两个核心错误:
- 缺少两表关联的外键匹配条件:Battery表通过
capacity_id字段关联Capacity表的主键id,原SQL的ON子句只写了Capacity表name字段的区间过滤,没有写battery.capacity_id = capacity.id的关联规则,数据库会执行笛卡尔积匹配,自然生成大量重复无效行 - JOIN类型选择不符合需求:需要的是关联Capacity后name落在指定区间的Battery记录,如果用LEFT JOIN且过滤条件写在ON子句中,会返回所有Battery记录,不符合预期。
正确查询语句
推荐用INNER JOIN写法,逻辑最直观,不会返回不符合条件的Battery记录:
SELECT b.* FROM battery b INNER JOIN capacity c ON b.capacity_id = c.id -- 补全外键关联条件,是解决重复问题的核心 AND c.name > 20 AND c.name < 35;
如果Capacity表中id是主键(唯一不重复),上面的语句不会返回任何重复的Battery记录。如果存在同id多条符合区间的Capacity记录,可以加DISTINCT去重:
SELECT DISTINCT b.* FROM battery b INNER JOIN capacity c ON b.capacity_id = c.id WHERE c.name BETWEEN 21 AND 34; -- 字段为整数类型时,BETWEEN写法等价于大于20小于35的区间规则
原SQL的执行逻辑说明
之前编写的语句:
select * from battery LEFT JOIN capacity on capacity.name > 25 and capacity.name < 35
实际执行逻辑是:为每一条Battery记录,匹配所有name落在25~35区间的Capacity记录,完全不校验外键对应关系。如果表中有100条Battery记录、10条符合区间的Capacity记录,最终会返回100*10=1000条拼接结果,绝大多数是无效重复数据。
内容的提问来源于stack exchange,提问作者LordBarov
相关产品推荐
相关产品推荐

