Использование IS NULL или IS NOT NULL в условиях соединения - Теоретический вопрос

Теоретический вопрос здесь:

Почему указание 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.

В чем причина этого?

37
задан Paul Sonier 8 July 2011 в 21:53
поделиться