JOIN и отображение COUNT равного нулю

Есть две таблицы:

  1. names
  2. events

Нужно из name выбрать все имена отвечающие определенному условию, а из events количество определенного типа событий, которые относятся к выбранным именам. При этом если количество событий равно нулю, то строка с названием должна быть, а значение COUNT должно быть равно NULL или 0, не важно.

Сделал такой запрос:

SELECT
    names.name,
    COUNT (*)
FROM
    names
LEFT OUTER JOIN events ON (
    names.id = events.address
)
WHERE
    events.type IN (1)
AND names.notallow in (0)
AND events.time >= now() - '1 day' :: INTERVAL
GROUP BY
    names.name
ORDER BY
    names.name

Но он возвращает только те строки, в которых значение COUNT > 0. Как получить полный список name, в котором будут отображаться и NULL значения и значения >0?


Ответы (1 шт):

Автор решения: Akina

При использовании LEFT JOIN любое условие во WHERE по правой таблице (в данном случае - events), если это не условие "что-то IS NULL", немедленно превращает его в INNER JOIN. Все условия такого типа должны помещаться в ON.

SELECT names.name,
       COUNT(events.address) cnt
FROM names
LEFT OUTER JOIN events ON names.id = events.address
                      AND events.type IN (1)
                      AND events.time >= now() - '1 day' :: INTERVAL
WHERE names.notallow in (0)
GROUP BY names.name
ORDER BY names.name
→ Ссылка