PostgreSQL添加WHERE子句后查询无返回行的原因咨询
问题分析与解决
嘿,这个问题我之前也踩过坑,咱们一步步拆解来看:
首先,先搞清楚第一个查询为啥能正常返回结果:
- 你用的是
LEFT JOIN,这种连接的核心逻辑是保留左表(也就是events)的所有记录,不管右表(sensor)有没有匹配的数据。 - 因为
sensor表是空的,左连接后每一行的sensor.eventtype都是NULL,而count(sensor.eventtype)会自动忽略NULL值,所以最终每个事件的统计次数都是0,完全符合预期。
那第二个查询为啥啥都没返回呢?问题出在WHERE子句的作用时机上:
- 当你在
LEFT JOIN之后加WHERE eventdate = '2019-06-19'时,这个条件是对连接完成后的整个结果集进行过滤的。 - 由于
sensor表是空的,左连接后所有行的sensor.eventdate都是NULL,而NULL和任何值做比较(包括等于指定日期)的结果都是FALSE。这样一来,所有行都被WHERE子句过滤掉了,自然就没有返回结果了。
正确的写法
如果你想保留events表的所有事件,同时只统计sensor表中指定日期的事件次数,需要把日期条件放到JOIN的ON子句里,而不是WHERE子句:
SELECT events.eventtype, count(sensor.eventtype) FROM events LEFT JOIN sensor ON sensor.eventtype = events.eventtype AND sensor.eventdate = '2019-06-19' -- 将日期条件移到这里 GROUP BY events.eventtype
这样做的区别是:ON子句的条件是在连接过程中生效的,它只会过滤sensor表中不符合日期的行,不会影响events表的记录。即使sensor表中没有对应日期的匹配数据,events的所有事件依然会被保留,对应的统计次数还是0。
内容的提问来源于stack exchange,提问作者user11624254
相关产品推荐
相关产品推荐

