Это один из способов реализации операции antijoin для реляционной базы данных, называемой anti semi join в терминологии сервера sql.По сути, это «перенести строки из одной таблицы, которых нет в другой таблице».
Я не могу думать об этом следующим образом:
select cols from t1 left join t2 on t1.key=t2.key where t2.key is null
select cols from t1 where key not in (select key from t2)
select cols from t1 where not exists (select 1 from t2 where t1.key=t2.key)
и даже
select * from t1 where key in (select key from t1 except select key from t2)
Существуют некоторые различия между этими методами (в частности, опасность нулевой обработки вслучай not in
), но обычно они делают то же самое.
Для решения ваших вопросов:
Трудно понять, почему кто-то оставил присоединиться кID и затем установите его в NULL в предложении where?
Как уже упоминалось, для исключения результатов из t1, которые присутствуют в t2
Можем ли мы просто опуститьТаблица2 в целом?Как вообще не объединяться?
Если вы не используете объединение (или любую из его альтернатив эквивланта), вы получите больше результатов, так как строки в таблице1 имеют одинаковый идентификатор свсе строки в table2 также будут возвращены.