2010-02-25 24 views
7

Seçme ifadesi tarafından belirtilen varchar değerlerine sahip olmayan satır sayısını saymaya çalışırken garip bir duruma rastladım. Tamam, bana kafa karıştırıcı geliyor, bu yüzden bana bir örnek vereyim:COUNT() Varchar alanıyla düzgün çalışmayan işlev IN (T-SQL)

"SomeTable" alanında bir alanım "MyField" var ve kaç tane MyField değerine sahip olduğumu hesaba katalım. "SomeOtherTable" içindeki "MyOtherField" değerleri tarafından tanımlanan etki alanı. Başka bir deyişle, MyOtherField = {1, 2, 3} olduğunu varsayalım, kaç tane MyField değerinin 1, 2 veya 3 olmadığını saymak istiyorum. Bunun için aşağıdaki sorguyu kullanırdım:

SELECT COUNT(*) FROM SomeTable 
WHERE ([MyField] NOT IN (SELECT MyOtherField FROM SomeOtherTable)) 

Ve bir çekicilik gibi çalışır. Ancak, MyField ve MyOtherField'ın yazıldığını unutmayın. Aynı sorguyu çalıştırmayı denediğimde, varchar yazılan alanlar haricinde, geri dönüş değeri 0, yanlış değerler olduğunu bilmeme rağmen, onları oraya koydum! Ve eğer, ancak, tersi saymaya çalışıyorum (kaç satırın ne kadarı olduğu alana karşı kaç tane satır değil, kaç satır değil) sadece yukarıdaki sorgudaki "NOT" ifadesini bastırarak ... Eserleri! 12

Evet, bunun için bir sürü geçici çözüm olmalı, ancak neden gerektiği gibi çalışmadığını bilmek istiyorum. Üstelik, C# kodunun çoğunda oluşturulduğu ve temelde yazılımın herhangi bir bölümünde bir etkisi olmayacak şekilde değiştirebileceğim tek parçamın seçtiği tek deyim olduğu için tüm sorguyu değiştiremiyorum. etki alanına karşılık gelir (NOT IN cümlede ne olursa olsun). Umarım kendimi temizledim ve dışarıda biri bana yardım edebilirdi.

Şimdiden teşekkürler.

+1

Bu alan için "SomeOtherTable" içinde NULL işareti var mı? –

cevap

6

NOT IN, alt sorgu bir NULL değeri döndürdüğünde her zaman yanlıştır. this question'un kabul edilen cevabı, zarif bir şekilde nedenini açıklıyor.

bir sütun değerinin nullability çok kullanılan veri türü bağımsızdır: büyük olasılıkla varchar sütunlar, bu başa mı NULL değerleri

sahiptir NOT EXISTS kullanın. boş olmayan değerler için, o kadar

SELECT COUNT(*) FROM SomeTable S1 
WHERE NOT EXISTS (SELECT * FROm SomeOtherTable S2 WHERE S1.[MyField] = S2.MyOtherField) 
+0

Teşekkürler, önerilen sorgunuzu kullanarak ANLAŞMAYI DEĞİL ne istediğimi yaptı. –

0

GBN daha eksiksiz bir cevabı vardır uyumlu DEĞİLDİR İÇİNDE gibi çalışır, ama tüm unutmamak rahatsız olamaz. Bunun yerine, benim IN yan tümcelerden süzülme dini alışkanlığım var:

SELECT COUNT(*) 
FROM SomeTable  
WHERE [MyField] NOT IN (
    SELECT MyOtherField FROM SomeOtherTable 
    WHERE MyOtherField is not null 
)