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

PostgreSQL中LEFT JOIN的ON条件含f.id=-1时返回全表行数原因是什么?

问题原因解析

这是LEFT JOIN的特性导致的,和你写的ON条件逻辑无关:

  • 左连接的核心规则是必须完整保留左表的所有行,ON子句仅用来判断左表行能不能匹配到右表的对应行,不会删除任何左表的行。
  • 你在ON条件里加的f.id = -1,作用只是限定:只有左表skyroom_files中id为-1的行,才有可能匹配到users表的对应行,其余左表行全部匹配不到右表。匹配不到的行只会把右表的所有字段填NULL,不会从结果集里删掉左表的行。
  • 你用count(*)统计的是结果集的总行数,自然等于左表skyroom_files的全表行数,不管你把ON里的f.id改成什么值,最终统计的行数都不会变化。

如果你想要得到你预期的“条件不满足就返回空”的效果,需要把f.id = -1放到WHERE子句里,而不是ON子句里,WHERE子句会对最终的结果集做全局过滤,这时候如果没有满足f.id = -1的行,查询结果就会是空。
对比示例:

-- 这个才会过滤左表行,结果可能为空
select count(*)
from skyroom_files f
left join users u on f.user_id = u.id
where f.id = -1;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:39:04