Подумайте о внешнем соединении, работающем так:
Если подходящей строки не найдено, генерируется фиктивная строка, которая служит вместо соответствующей строки. Эта фиктивная строка целиком состоит из значений NULL.
Когда мы перейдем к предложению WHERE, любое условие, для которого столбец из внешней объединенной таблицы должен быть ненулевым, исключит сгенерированную фиктивную строку. И это фактически сводит на нет «внешность» соединения, делая его эквивалентным внутреннему соединению.
Чтобы связать это конкретно с запросом в вопросе: это условие в предложении WHERE:
C.Timstamp LIKE :end_date2
требует, чтобы Timstamp
из внешней объединенной таблицы C
был ненулевым.
Это условие оценивается как NULL для любой строки, имеющей значение NULL для C.Timstamp
. Поскольку условие не оценивается как ИСТИНА, строка будет исключена. Вот причина поведения, которое мы наблюдаем.
Исправлено устранение требования, что C.Timstamp
должен быть ненулевым.
Обычный шаблон - удалить условие из предложения WHERE и переместить в предложение ON
объединения, например,
LEFT
JOIN ebay_hitswatches C
ON C.ItemID = A.ItemID
AND C.Timstamp LIKE :end_date2
WHERE ...