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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 18:27:39