2010-04-02 13 views
5

Spędziłem trochę czasu próbuje dowiedzieć się, dlaczego ta kwerenda nie ciągnie wyniki Spodziewałem:Dlaczego „nie istnieje” pracę zapytań SQL i „nie” nie

SELECT * FROM NGS WHERE ESPSSN NOT IN (SELECT SSN FROM CENSUS) 

wreszcie próbowałem pisanie kwerendy inną drogę i to skończyło się oczekiwane wyniki:

SELECT * FROM NGS n WHERE NOT EXISTS (SELECT * FROM CENSUS WHERE SSN = n.ESPSSN) 

pierwszego zapytania wydaje się bardziej odpowiednie i „poprawny”. Używam "w" i "nie w" przez cały czas dla podobnych wyborów i nigdy nie miałem problemu z , które znam z.

Odpowiedz

11

Jeśli piszesz na cukier syntaktyczny, x not in (1,2,3) staje:

x <> 1 AND x <> 2 AND x <> 3 

Więc jeśli kolumna ssn zawiera wartość null, pierwsze zapytanie jest odpowiednikiem:

WHERE ESPSSN <> NULL AND ESPSSN <> ... 

Wynikiem porównanie z NULL jest nieznane, więc zapytanie nic nie zwróci.

+0

Dobra rozmowa! Właśnie sprawdziłem i w tabeli jest wartość pusta. Przepisanie zapytania na SELECT * FROM NGS WHERE ESPSSN NOT IN (WYBIERZ ISNULL (SSN, '') Z CENSUS) dało mi oczekiwaną wartość. Zastanawiam się, który powinienem użyć? – Josh

+0

@Josh: Domyślnie "nie istnieje", ponieważ nie cierpi z powodu 'null'. Ale jeśli masz problemy z wydajnością, warto rozważyć plan zapytań dla obu opcji. – Andomar

+0

@Josh, @Andomar: ISNULL unieważni użycie jakiegokolwiek indeksu, który mógł zostać użyty przed – gbn

2

jako Andomar powiedział uwaga wartości NULL przy użyciu NOT IN

Należy również zauważyć, że zapytanie przy użyciu NOT IN orzeczenie zawsze wykonać zagnieżdżone pełnego skanowania tabeli, przy czym zapytanie z NOT EXISTS może użyć wskaźnika w sub-zapytania i w rezultacie być znacznie szybszym.

+0

Dobrze wiedzieć. Dzięki. – Josh

Powiązane problemy