SQL

2010-11-18 17 views
5

'DA NOT yüklemelerini kullanma Bazı sorgular oluşturdum ve sonuçların neden beklediğim gibi olmadığını anlayamıyorum.SQL

Sorgu II ve III'ün neden aynı sonuçları döndürmediğini anlamıyorum. Sorgu II'nin Query I tarafından seçilmemiş tüm satırları döndürmesini beklerim.

Aynı sonuçları vermesi için Query II ve III olmasını beklerdim. Benim düşünceme göre, III sonuçları doğru olanlardır.

Eminim bir şeyleri özlüyorum, sadece ne olduğunu bilmiyorum.

örnek:

Tablo:

CREATE TABLE [dbo].[TestTable](
[TestTableId] [int] NOT NULL, 
    [ValueA] [int] NULL, 
[ValueB] [int] NULL 
) ON [PRIMARY] 

veri:

TestTableId ValueA ValueB 
1  10  5 
2  20  5 
3  10  NULL 
4  20  NULL 
5  NULL  10 
6  10  10 
7  NULL  NULL 

Sorgular:

Bütün kayıtlar: select * TestTable

den

I. Bir seçme sorgusu:

select * from TestTable 
where (ValueA = 10 or ValueA = 20) AND ValueB = 5 

Sonuç:

TestTableId ValueA ValueB 
1   10 5 
2   20 5 

II. Aynı sorgu ancak DEĞİL

select * from TestTable 
where NOT ((ValueA = 10 or ValueA = 20) AND ValueB = 5) 

Sonuç:

TestTableId ValueA ValueB 
5   NULL 10 
6   10 NULL 

III. İkinci olarak aynı sorgu

select * from TestTable where TestTable.TestTableId not in 
    (select TestTableId from TestTable 
where (ValueA = 10 or ValueA = 20) AND ValueB = 5) 

Sonucu (sanırım):

TestTableId ValueA ValueB 
3   10 NULL 
4   20 NULL 
5   NULL 10 
6   10 10 
7   NULL NULL 

cevap

5

NULL komik yaratıklardır. Bulduğunuz olarak NULL değerleri ile sonuçlanır

Are you 5? (... WHERE ValueB = 5) 

ve

Are you Not 5? (... WHERE NOT ValueB = 5) 

, hem sorguları dışlanmasına: Bunlar aşağıdaki sorulardan ikisine de "Bilmiyorum" cevap verecektir.

... WHERE (ValueB IS NULL OR NOT ValueB = 5) ... 
+0

'NULL = 5'' UNKNOWN' ("no" yerine) olarak değerlendirir. – onedaywhen

+0

Biraz mecazi çalışıyordum. Asıl nokta, ValueB'nin NULL olduğu bir satırın her ikisinden de hariç tutulacağıdır. – BradC

+0

@onedaywhen - Yayınınızı, yorumunuza bağlı olarak biraz daha hassas olacak şekilde düzenledim. – BradC

2

NOT kullanılarak NULL değerler özel bir durum vardır:

Açıkça boş değerlere hesaba katan bir şekilde soru sormak gerekir. Bir NULL, bir bilinmeyen bir değeridir. SQL, NOT'un 12 olduğunu söyleyemez, ancak 'un a 12 olduğunu söyleyebilir.

iyi bir örnek:

Bir partide bulunmaktadır. Odada 12 kişinin adından 2 tanesini biliyorsun, ikisi de John. Bana "John" ın kim olduğunu söyleyebilirsin. , tarafından 2 "John" un yanı sıra "Not Jack" in kim olduğunu söyleyemezsiniz. SQL için, o odada bulunan diğer 10 kişi NULL adını taşır.