Mengidentifikasi nilai mana yang TIDAK cocok dengan baris tabel


10

Saya ingin dapat dengan mudah memeriksa pengidentifikasi unik mana yang tidak ada dalam tabel, yang disediakan dalam kueri.

Untuk lebih menjelaskan, inilah yang akan saya lakukan sekarang, untuk memeriksa ID mana dari daftar "1, 2, 3, 4" yang tidak ada dalam tabel:

  1. SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4'), katakanlah tabel tidak mengandung baris dengan ID 2.
  2. Buang hasilnya ke Excel
  3. Jalankan VLOOKUP pada daftar asli yang mencari setiap nilai daftar dalam daftar hasil.
  4. VLOOKUP apa pun yang menghasilkan a #N/Aadalah pada nilai yang tidak muncul dalam tabel.

Saya pikir pasti ada cara yang lebih baik untuk melakukan ini. Saya mencari, idealnya, untuk sesuatu seperti

Daftar untuk memeriksa -> Permintaan di atas meja untuk memeriksa -> Anggota daftar tidak di dalam tabel


Tolong jangan membuat kami menebak versi SQL Server?
Aaron Bertrand


Permintaan maaf. [diedit] Sudah tua. Masalahnya dengan NOT IN adalah ia akan mengembalikan semua yang ada di tabel ...
NReilingh

Jawaban:


14

Gunakan EXCEPT:

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

Lihat SqlFiddle .


The valueskonstruktor hanya akan bekerja pada SQL Server 2008 atau lambat. Untuk tahun 2005, gunakan

SELECT 'value'
UNION SELECT 'value'

sebagaimana dirinci dalam jawaban SO ini .


Aduh, seharusnya sudah ditentukan. Bagaimana jika ID adalah varchar?
NReilingh

1
@NReilingh kemudian mendesain ulang DB Anda :) tetapi harus bekerja sama saya pikir
JNK

Saya terus mendapatkan Incorrect syntax near the keyword 'values'.ketika berlariSELECT * FROM (values ('search string'),('other string')) as T(ID)
NReilingh

Sintaks Anda berfungsi dengan baik untuk saya di SQL Server 2008r2 - Saya menempelkan komentar Anda dan itu berjalan.
JNK

Saya pada 2005. Christ.
NReilingh

6

Saya akan membuat variabel tabel atau tabel temp berisi ID yang Anda cari ... kemudian gunakan solusi Remus, minus gula sintaksis 2008:

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

Saya sekarang beberapa tahun lebih bijaksana (dan memiliki SQL Server yang lebih baru) daripada ketika saya mengajukan pertanyaan ini, jadi untuk merayakan lencana Pertanyaan Terkenal yang saya dapatkan karena menanyakan hal ini, inilah yang akan saya lakukan sekarang. (Saya pikir saya tidak pernah menggunakan EXCEPToperator sejak itu.)

Saya akan mengatakan LEFT JOINmetode di bawah ini lebih berguna daripada EXCEPTkarena Anda dapat menulisnya dengan gabungan lain tanpa perlu CTE.

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;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.