Предложения:
Переместите условия, которые требуют, чтобы столбец отличался от NULL, из предложения WHERE
до соответствующего предложения ON
внешнего соединения.
Не смешивайте синтаксис запятой старой школы (для операции соединения) с синтаксисом ключевого слова JOIN
. Откажитесь от синтаксиса запятой и просто используйте JOIN
. И перенесите условия соединения в предложение ON
.
Перемещение условия в предложение ON внешнего соединения позволит вернуть значения NULL.
Если мы сделаем это предложение WHERE, обратите внимание, что условие
WHERE ( col = some_non_null_val AND col IS NULL )
гарантированно никогда не оценивается как ИСТИНА. (Условие проверяется для каждой отдельной строки.) Будут возвращены только те строки, в которых условие оценивается как ИСТИНА. Скорее всего, вы хотели использовать OR
вместо AND
.
Но мы можем избежать этого OR
, если просто переместим условие
col = some_non_null_val
к предложению ON
внешнего соединения.
Стесняюсь привести пример запроса в качестве демонстрации. Исходный запрос производит полукартово произведение; например, то, что кажется перекрестным соединением между users
и user_subscriptions
... единственным критерием для соответствия user_subscriptions
является keywords=1
. Так что я не понимаю спецификации.
OP сообщает, что запрос возвращает правильный результат, но я подозреваю, что запрос на самом деле не удовлетворяет предполагаемой спецификации. Я подозреваю, что соответствие между users
и user_subscriptions
должно включать некоторые дополнительные критерии.
Без более точной спецификации, включая примеры данных и пример ожидаемого вывода, я не могу с чистой совестью привести пример SQL для сценария использования OP.