Теоретический вопрос здесь:
Почему указание table.field IS NULL или table.field IS NOT NULL не работает при условии соединения (например, левое или правое соединение), а только в условии where ?
Нерабочий Пример:
- это должно возвращать все поставки с отфильтрованными возвратами (ненулевые значения). Однако это возвращает все поставки, независимо от того, соответствует ли что-либо оператору [r.id is null].
SELECT
*
FROM
shipments s
LEFT OUTER JOIN returns r
ON s.id = r.id
AND r.id is null
WHERE
s.day >= CURDATE() - INTERVAL 10 DAY
Рабочий пример:
-Это возвращает правильное количество строк, которое является общим количеством отправлений, за вычетом любых связанных с возвратами (не нулевые значения).
SELECT
*
FROM
shipments s
LEFT OUTER JOIN returns r
ON s.id = r.id
WHERE
s.day >= CURDATE() - INTERVAL 10 DAY
AND r.id is null
Почему это так? Все остальные условия фильтрации между двумя объединяемыми таблицами работают нормально, но по какой-то причине фильтры IS NULL и IS NOT NULL не работают, если только в операторе where.
В чем причина этого?