Hangi değerlerin tablo satırıyla eşleşmediğini belirleme


10

Bir sorguda sağlananların bir tabloda hangi benzersiz tanımlayıcıların bulunmadığını kolayca kontrol etmek istiyorum.

Daha iyi açıklamak için, şimdi ne yapacağım, "1, 2, 3, 4" listesinin hangi kimliklerinin bir tabloda olmadığını kontrol etmek için:

  1. SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4'), tablonun ID 2'ye sahip satır içermediğini varsayalım.
  2. Sonuçları Excel'e dök
  3. Sonuç listesinde her liste değerini arayan orijinal listede bir DÜŞEYARA çalıştırın.
  4. A ile sonuçlanan DÜŞEYARA #N/Atabloda bulunmayan bir değerdedir.

Bunu yapmanın daha iyi bir yolu olması gerektiğini düşünüyorum. İdeal olarak şöyle bir şey arıyorum

Kontrol edilecek liste -> Kontrol edilecek tablodaki sorgu - - Listedeki tabloda olmayan üyeler


Lütfen bize SQL Server sürümünü tahmin etmeyin?
Aaron Bertrand


Özür. Eski. NOT IN ile sorun tablodaki her şeyi geri dönecek olmasıdır ...
NReilingh

Yanıtlar:


14

Kullanım EXCEPT:

SELECT * FROM
  (values (1),(2),(3),(4)) as T(ID)
EXCEPT
SELECT ID 
FROM [TABLE];

Bkz. SqlFiddle .


valuesYapıcı yalnızca SQL Server 2008 veya sonrası üzerinde çalışacak. 2005 için,

SELECT 'value'
UNION SELECT 'value'

Bu SO cevabında ayrıntılı olarak açıklanmıştır .


Hata! Belirtmeliydim. Kimlik bir varchar ise ne olur?
NReilingh

1
@NReilingh sonra DB yeniden tasarlayın :) ama bence aynı çalışması gerekir
JNK

Ben almaya devam Incorrect syntax near the keyword 'values'.çalıştırırkenSELECT * FROM (values ('search string'),('other string')) as T(ID)
NReilingh

Sözdizim SQL Server 2008r2'de benim için iyi çalışıyor - Yorumunuzu yapıştırdım ve çalıştı.
JNK

2005'deyim. Tanrım.
NReilingh

6

Aradığın kimlikleri içeren bir tablo değişkeni veya geçici tablo oluşturacağım ... sonra Remus'un çözümünü eksi 2008 sözdizimsel şekerini kullanacağım:

declare @t table (ID int)
insert into @t values (1)
insert into @t values (2)
insert into @t values (3)
insert into @t values (4)
insert into @t values (5)

select ID from @t
except
select ID
from [Table];

3

Şimdi bu soruyu sorduğumdan birkaç yıl daha akıllıyım (ve daha yeni bir SQL Server'a sahibim), bu yüzden bunu sormak için aldığım Ünlü Soru rozetini kutlamak için, şimdi ne yapacağım. (O EXCEPTzamandan beri operatörü kullandığımı sanmıyorum .)

LEFT JOINAşağıdaki yöntemin EXCEPTbir CTE'ye ihtiyaç duymadan diğer birleşimlerle oluşturabildiğinizden daha yararlı olduğunu söyleyebilirim .

SELECT v.val
  FROM (VALUES (1), (2), (3), (4), (5)) v (val)
    LEFT JOIN dbo.SomeTable t
      ON t.id = v.val
  WHERE t.id IS NULL;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.