Все ответы помогут вам исправить ваш код. Я просто хочу рассказать, почему они будут работать.
Движок SQL сначала оценивает ваши FROM
и ваши JOIN
, вытягивая ваш начальный набор данных в память. В этот момент, поскольку вы использовали LEFT OUTER JOIN
, все ожидаемые строки все еще там.
После этого применяется ваше предложение WHERE
. В этом случае ваше предложение WHERE
включает job.job_date BETWEEN '2018-10-21' AND '2018-10-30'
, поэтому в этот момент механизм отфильтровывает все строки, которые не соответствуют этим критериям. Это эффективно делает результаты вашего LEFT JOIN
точно такими же, как результаты, которые вы получили бы с INNER JOIN
.
Лучший ответ, который предлагался несколько раз, состоит в том, чтобы переместить эти критерии фильтрации в ваше предложение ON
. Альтернатива, которая будет работать, и которая демонстрирует, что результаты на самом деле все с самого начала, - это добавление возможности IS NULL
к существующему предложению WHERE
:
...
WHERE
NOT ("users"."status" = 'F')
AND
(
(job.job_date BETWEEN '2018-10-21' AND '2018-10-30')
OR
job.job_date IS NULL
)
Использование условия на JOIN
, тем не менее, будет работать лучше, потому что в первую очередь вы загружаете меньше записей в память.