2010-04-02 8 views
5

fa ho trascorso qualche tempo a cercare di capire il motivo per cui questa query non sta tirando i risultati che mi aspettavo:Perché il "non esiste" il lavoro query SQL e "non in" non

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

finalmente ho provato scrivere la query in un altro modo e questo finito per ottenere i risultati attesi:

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

la prima query sembra più appropriato e "corretta". Io uso "in" e "non in" tutto il tempo per selezioni simili e non ho mai avuto un problema che so di.

risposta

11

Se si scrive lo zucchero sintattico, x not in (1,2,3) diventa:

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

Quindi, se la colonna ssn contiene un valore null, la prima query è l'equivalente di:

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

Il risultato di il confronto con NULL è sconosciuto, quindi la query non restituirà nulla.

+0

Buona chiamata! Ho appena controllato e c'è un valore nullo nella tabella. Riscrivendo la query su SELECT * FROM NGS WHERE ESPSSN NON IN (SELEZIONA ISNULL (SSN, '') FROM CENSUS) mi ha dato il valore atteso. Mi chiedo quale devo usare? – Josh

+0

@Josh: I predefinito per 'non esiste' perché non risente del trucco' nullo'. Ma se hai problemi di prestazioni, può valere la pena esaminare il piano di query per entrambe le opzioni – Andomar

+0

@Josh, @Andomar: L'ISNULL invaliderà l'uso di qualsiasi indice che potrebbe essere stato utilizzato prima di – gbn

2

Come Andomar detto, attenzione valori NULL quando si utilizza NOT IN

noti inoltre che una query utilizzando il NOT IN predicato effettuerà sempre annidati scansione completa della tabella, mentre una query utilizzando NOT EXISTS può utilizzare un indice all'interno del sub-query ed essere molto più veloce di conseguenza.

+0

Buono a sapersi. Grazie. – Josh

Problemi correlati