Xác định giá trị nào KHÔNG khớp với một hàng của bảng


10

Tôi muốn có thể dễ dàng kiểm tra những số nhận dạng duy nhất không tồn tại trong một bảng, trong số những số được cung cấp trong một truy vấn.

Để giải thích rõ hơn, đây là những gì tôi sẽ làm bây giờ, để kiểm tra ID nào của danh sách "1, 2, 3, 4" không tồn tại trong một bảng:

  1. SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4'), giả sử bảng không chứa hàng có ID 2.
  2. Kết quả vào Excel
  3. Chạy một VLOOKUP trên danh sách gốc tìm kiếm từng giá trị danh sách trong danh sách kết quả.
  4. Bất kỳ VLOOKUP nào dẫn #N/Ađến một giá trị không xảy ra trong bảng.

Tôi nghĩ rằng phải có một cách tốt hơn để làm điều này. Tôi đang tìm kiếm, lý tưởng, cho một cái gì đó như

Danh sách để kiểm tra -> Truy vấn trên bảng để kiểm tra -> Thành viên của danh sách không có trong bảng


Xin đừng bắt chúng tôi đoán phiên bản SQL Server?
Aaron Bertrand


Lời xin lỗi. [chỉnh sửa] Nó cũ. Vấn đề với KHÔNG VÀO là nó sẽ trả lại mọi thứ khác trong bảng ...
NRzingh

Câu trả lời:


14

Sử dụng EXCEPT:

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

Xem SqlFiddle .


Hàm valuestạo sẽ chỉ hoạt động trên SQL Server 2008 trở lên. Đối với năm 2005, sử dụng

SELECT 'value'
UNION SELECT 'value'

như chi tiết trong câu trả lời SO này .


Rất tiếc, nên có chỉ định. Điều gì xảy ra nếu ID là một varchar?
NRzingh

1
@NRzingh sau đó thiết kế lại DB của bạn :) nhưng nó sẽ hoạt động giống như tôi nghĩ
JNK

Tôi tiếp tục nhận được Incorrect syntax near the keyword 'values'.khi chạySELECT * FROM (values ('search string'),('other string')) as T(ID)
NRzingh

Cú pháp của bạn hoạt động tốt với tôi trong SQL Server 2008r2 - Tôi đã dán nhận xét của bạn vào và nó chạy.
JNK

Tôi vào năm 2005. Chúa Kitô.
NRzingh

6

Tôi sẽ xây dựng một biến bảng hoặc bảng tạm thời chứa ID mà bạn đang tìm kiếm ... sau đó sử dụng giải pháp của Remus, trừ đường cú pháp 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

Bây giờ tôi đã khôn ngoan hơn vài năm (và có Máy chủ SQL mới hơn) so với khi tôi hỏi câu hỏi này, vì vậy để chúc mừng huy hiệu Câu hỏi nổi tiếng tôi nhận được khi hỏi điều này, đây là những gì tôi sẽ làm bây giờ. (Tôi không nghĩ rằng tôi đã từng sử dụng EXCEPTtoán tử kể từ đó.)

Tôi muốn nói rằng LEFT JOINphương pháp dưới đây hữu ích hơn EXCEPTvì bạn có thể kết hợp nó với các phép nối khác mà không cần 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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.