2013-06-20 16 views
9

Xin lỗi nếu có câu trả lời cho điều này, tôi đã tìm kiếm và có thể không nghĩ ra đúng từ khóa để tìm thấy nó.CHỌN những người không được tìm thấy trong IN() danh sách

Tôi có một bảng với hơn 1000 bảng (ví dụ: Khách hàng).

Tôi có một truy vấn yêu cầu chi tiết của một danh sách được biết đến của khách hàng (ví dụ bằng cách CustomerID - 1,79,14,100,123)

IN() chức năng là những gì tôi muốn sử dụng cho truy vấn.

tôi biết để tìm kiếm khách hàng phù hợp với danh sách, tôi sẽ viết:

SELECT * FROM Customers WHERE CustomerID IN (1,79,14,100,123)

Để tìm những người không nằm trong danh sách này, tôi sẽ viết

SELECT * FROM Customers WHERE CustomerID NOT IN (1,79,14,100,123)

Câu hỏi

Tôi làm cách nào để tìm danh sách Cust omers rằng nơi không trả lại hoặc không tìm thấy một trận đấu từ danh sách.

Giả sử bảng Khách hàng chỉ có (1,79,100). Sau đó, nó sẽ có nghĩa là 14 và 123 sẽ không được xuất hiện. Làm cách nào để tìm các giá trị không tìm thấy kết quả phù hợp.

Tôi đã đơn giản hóa trong ví dụ của mình. Danh sách các mục của tôi có hơn 300 ID, do đó, sử dụng điều kiện WHERE với danh sách dài OR sẽ rất cồng kềnh/vụng về. Tôi đã nghĩ đến việc kết hợp với tự LEFT JOIN và xác định các giá trị ghép nối NULL, sẽ là 14 và 123

Có cách tiếp cận trang nhã hơn không?

Trả lời

12

Bạn có thể sử dụng bảng có nguồn gốc hoặc bảng tạm thời, ví dụ để giữ danh sách CustomerId, sau đó tìm những cái không phù hợp với EXCEPT.

dưới đây sử dụng một table value constructor như một bảng có nguồn gốc (tương thích với SQL Server 2008+)

SELECT CustomerId 
FROM (VALUES(1), 
       (79), 
       (14), 
       (100), 
       (123)) V(CustomerId) 
EXCEPT 
SELECT CustomerId 
FROM Customers 
+1

Thank-you @ Martin Smith. Điều đó đã trả lời nó! Ngoài quan tâm, bạn có biết nếu có một phiên bản tương thích SQL ANSI? – user919426

+1

@ user919426 - 'EXCEPT' chắc chắn là ANSI SQL (mặc dù Oracle sử dụng không chuẩn' MINUS'). Tôi nghĩ rằng các nhà xây dựng giá trị bảng được bao gồm trong một số phiên bản của tiêu chuẩn là tốt. –

+0

Điều cần biết. Cảm ơn, một lần nữa! – user919426

1

Không có gì sai với LEFT JOIN là nhưng bạn cũng có thể sử dụng not exists

SELECT * 
FROM Customers c 
WHERE not exists (select * from CustomerDetails ds where ds.CustomerId = c.CustomerId) 
+0

Cảm ơn, mặc dù tôi không trả lời câu hỏi vì tôi muốn tất cả CustomerID không khớp với danh sách nếu CustomerID trong tuyên bố IN. – user919426

Các vấn đề liên quan