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
相关产品推荐
相关产品推荐

