Mam następujący przykład generowany przez MS Dostęp do generowania bazy wyników na Tabeli1 bez dopasowywania tabeli2 w kolumnach adresów 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)); 

Podczas próby analizy "gdzie (((Tabela2 Moje zrozumienie, gdzie klauzula jest jak mechanizm filtracyjny dla zapytania i Null jest pusty. Czy ktoś może mi pomóc zrozumieć to kontra intuicyjne?

0
LBNHTX 25 luty 2019, 01:59

2 odpowiedzi

Najlepsza odpowiedź

Najpierw, bardziej intuicyjny sposób napisania zapytania użyj 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]
                 ); 

Powiedział, że metoda LEFT JOIN jest całkowicie rozsądna - i rozsądna.

LEFT JOIN utrzymuje wszystkie wiersze w pierwszej tabeli ({x1}}) i dopasowywanie wierszy w drugim. Jeśli nie ma dopasowania, kolumny Table2 muszą być wypełnione wartością - i dla pasków, ta wartość jest NULL.

Klauzula WHERE utrzymuje tylko te wartości NULL. Voila! Utrzymuje wiersze w Table1, które nie mają żadnej pasującej wartości w Table2.

1
Gordon Linoff 24 luty 2019, 23:11

Wspomniałeś już o odpowiedziach:

Generowanie bazy wyników na tabeli1 bez dopasowywania tabeli2

Używasz LEFT JOIN, więc otrzymasz wszystkie wiersze z tabeli w lewo i dopasowywanie i puste (null) jako nieznane rzędy z prawej stół.
.. Niezrównane wiersze z tabeli prawy będą miały Table2.[IP Address] równe Null (ponieważ są niezrównane).
.. Więc stan:

WHERE Table2.[IP Address] Is Null

Zrobi dokładnie to, czego potrzebujesz:

Pobierz tylko te wiersze z tabeli w lewo , które nie mają dopasowania na stole prawy

.

1
forpas 24 luty 2019, 23:23