首页 > 解决方案 > 存在where子句时postgresql不返回行

问题描述

我有两张表,一张是传感器在发生不同事件时记录不同的事件,另一张是包含所有可能事件列表的参考表。传感器表当前为空。

SELECT
    events.eventtype,
    count(sensor.eventtype)
FROM
    events
    LEFT JOIN sensor ON sensor.eventtype = events.eventtype
GROUP BY
    events.eventtype

此查询正确返回事件列表及其发生情况(所有内容均为 0)

SELECT
    events.eventtype,
    count(sensor.eventtype)
FROM
    events
    LEFT JOIN sensor ON sensor.eventtype = allevents.eventtype
WHERE
    eventdate = '2019-06-19'
GROUP BY
    events.eventtype

但是,此查询不返回任何内容。where 子句有什么区别?

标签: sqlpostgresql

解决方案


您需要将过滤条件移至on子句:

SELECT e.eventtype, count(s.eventtype)
FROM events e LEFT JOIN
     sensor s
     ON s.eventtype = e.eventtype AND
        s.eventdate = '2019-06-19'
GROUP BY e.eventtype;

LEFT JOIN返回不匹配的值NULL。使用WHERE子句中的条件,这些被过滤掉。

作为一般规则,当使用 a 时,第一个LEFT JOIN上的条件进入子句。后续表的条件放在子句中。WHEREON


推荐阅读