SQL Server / MS Access помогают понять ГДЕ ОГОВОРКУ в терминах NULL и LEFT JOIN - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть следующий пример, сгенерированный MS Access для генерации результатов на основе таблицы 1 без сопоставления таблицы 2 по столбцам IP-адресов.

SELECT 
    Table1.ID, Table1.IP_Address, Table1.Field1 
FROM 
    Table1 
LEFT JOIN
    Table2 ON Table1.[IP_Address] = Table2.[IP Address] 
WHERE 
    (((Table2.[IP Address]) IS NULL)); 

При попытке анализа "ГДЕ (((Таблица2. [IP-адрес]]) Is Null)) "Я не понимаю, как это имеет смысл, так как я интерпретирую это как возвращаемые результаты, которые имеют значение NULL для table2 @ IP Address.Мое понимание предложения WHERE похоже на механизм фильтрации для вашего запроса, а NULL пуст.Может ли кто-нибудь помочь мне понять это нелогичное утверждение?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Во-первых, более интуитивно понятный способ написания запроса будет использовать NOT EXISTS:

SELECT Table1.ID, Table1.IP_Address, Table1.Field1 
FROM Table1
WHERE NOT EXISTS (SELECT 1 
                  FROM Table2 
                  WHERE Table1.[IP_Address] = Table2.[IP Address]
                 ); 

Тем не менее, метод LEFT JOIN вполне разумен - и разумен тоже.

LEFT JOIN сохраняет все строки в первой таблице (Table1) и соответствующие строки во второй.Если совпадений нет, то столбцы Table2 необходимо заполнить значением, а для несоответствий это значение равно NULL.

Предложение WHERE содержит только этиNULL значения.Вуаля!Он сохраняет строки в Table1, которые не имеют соответствующих значений в Table2.

0 голосов
/ 25 февраля 2019

Вы уже упомянули ответ:

создание результатов на основе таблицы 1 без сопоставления таблицы2

Вы используете LEFT JOIN, поэтому вы получаете все строки из LEFT таблицы и сопоставления и пустые (null) строки, не имеющие аналогов из таблицы RIGHT .Несопоставленные строки из таблицы RIGHT будут иметь Table2.[IP Address], равный Null (поскольку они не соответствуют).Итак, условие:

WHERE Table2.[IP Address] Is Null

сделает именно то, что вам нужно:

извлекать только те строки из таблицы LEFT , которые не совпадают с таблицей RIGHT

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...