2010-04-02 14 views
5

"değil de" "non var" beklenen sonuçlar elde sorgu başka bir yol ve bu kadar bitti yazma:SQL sorgusu iş ve yapar ben bu sorgu ı beklenen sonuçları çekerek değil neden anlamaya çalışırken biraz zaman geçirdim değil

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

ilk sorgu daha uygun ve "doğru" görünüyor. Ben benzer seçimler için her zaman "in" ve "değil" kullanın ve biliyorum ki bir sorun olmadı. Eğer sözdizimsel şeker dışarı yazarsanız

cevap

11

, x not in (1,2,3) olur:

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

sonucu: ssn sütun boş değer içeriyorsa

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

Yani, ilk sorgu eşdeğerdir NULL ile karşılaştırma bilinmiyor, bu nedenle sorgu hiçbir şey döndürmeyecekti. NOT IN

Ayrıca NOT IN yüklemi kullanarak bir sorgu her zaman alt sorgu içinde bir dizin kullanabilirsiniz NOT EXISTS kullanarak sorgu oysa, iç içe tam tablo taraması gerçekleştirmek unutmayın kullanırken Andomar olarak

+0

İyi çağrı! Daha yeni kontrol ettim ve tabloda boş bir değer var. Sorgu yeniden yazma SELECT * FROM NGS'DEN ESPSSN OLMADIĞINDAN (SELECT ISNULL (SSN, '') CENSUS'tan) beklenen değeri verdi. Acaba hangisini kullanmalıyım? – Josh

+0

@Josh: Varsayılan olarak "mevcut değil" çünkü "null" gotcha'sından muzdarip değil. Ancak, performans sorunlarınız varsa, her iki seçenek için de sorgu planını incelemeye değer olabilir. – Andomar

+0

@Josh, @Andomar: ISNULL, – gbn

2

BOŞ değerlere dikkat belirterek, ve sonuç olarak çok daha hızlı olun.

+0

'dan önce kullanmış olabilecek herhangi bir dizinin kullanımını geçersiz kılar. Teşekkürler. – Josh

İlgili konular