Пример А
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.key = table2.key
WHERE table2.key IS NULL;
Пример Б
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.key = table2.key AND table2.key IS NULL;
Будут ли два приведенных выше SQL-запроса логически эквивалентны или в чем смысл фильтрации в ON
?
Пример 1 — условие предложения WHERE
фильтрует окончательный результат, поэтому ваш пример 1 возвращает данные из table1
, для которых совпадающие данные отсутствуют в table2
, поскольку left join
основан на key
, и после этого условие where
фильтрует все записи, которые не имеют соответствия key
в table2
— вы найдет меньше или равно общему table1
записи в результате
Пример 2. Условие в ON
используется для соединения двух таблиц, поэтому ваш пример 2 предоставит вам все данные из table1
и только соответствующие данные из table2
. Но поскольку вы использовали конфликтующее условие в предложении ON
(ON table1.key = table2.key AND table2.key IS NULL
), ваш пример2 вернет все данные для table1
и не вернет данные для table2
(null
во всех столбцах для таблицы2) - окончательный результат будет иметь количество записей, равное количеству записей в table1
.
Пример B не будет присоединяться ни к чему, потому что предложение ON всегда будет FALSE.
Итак, технически ваш пример B равен:
SELECT my_column
FROM table1
Когда пример A вернет все записи из таблицы A, для которых нет соответствующих записей в таблице B.