2010-04-02 32 views
5

tôi đã dành một thời gian cố gắng tìm ra lý do tại sao truy vấn này không kéo kết quả tôi mong đợi:Tại sao "không tồn tại" việc truy vấn SQL và "không" không

SELECT * FROM NGS WHERE ESPSSN NOT IN (SELECT SSN FROM CENSUS) 

cuối cùng tôi đã cố gắng viết các truy vấn một cách khác và này đã kết thúc nhận được kết quả mong đợi:

SELECT * FROM NGS n WHERE NOT EXISTS (SELECT * FROM CENSUS WHERE SSN = n.ESPSSN) 

truy vấn đầu tiên có vẻ thích hợp hơn và "đúng". Tôi sử dụng "in" và "not in" tất cả thời gian cho các lựa chọn tương tự và chưa bao giờ gặp sự cố mà tôi biết là.

Trả lời

11

Nếu bạn viết ra các đường cú pháp, x not in (1,2,3) trở thành:

x <> 1 AND x <> 2 AND x <> 3 

Vì vậy, nếu cột ssn chứa một giá trị null, truy vấn đầu tiên là tương đương với:

WHERE ESPSSN <> NULL AND ESPSSN <> ... 

Kết quả của so sánh với NULL là không xác định, vì vậy truy vấn sẽ không trả lại bất cứ điều gì.

+0

Cuộc gọi tốt! Tôi vừa kiểm tra và có một giá trị null trong bảng. Viết lại câu truy vấn SELECT * FROM NGS WHERE ESPSSN NOT IN (SELECT ISNULL (SSN, '') TỪ CENSUS) cho tôi giá trị mong đợi. Tôi tự hỏi tôi nên sử dụng cái nào? – Josh

+0

@Josh: Tôi mặc định là 'không tồn tại' vì nó không bị lỗi' null'. Nhưng nếu bạn có vấn đề về hiệu suất, bạn có thể xem xét kế hoạch truy vấn cho cả hai tùy chọn – Andomar

+0

@Josh, @Andomar: ISNULL sẽ vô hiệu hóa việc sử dụng bất kỳ chỉ mục nào có thể đã được sử dụng trước – gbn

2

Như Andomar nói, hãy cẩn thận của các giá trị NULL khi sử dụng NOT IN

Cũng lưu ý rằng một truy vấn bằng cách sử dụng NOT IN vị sẽ luôn thực hiện lồng nhau quét bảng đầy đủ, trong khi một truy vấn sử dụng NOT EXISTS có thể sử dụng một chỉ số trong phạm vi phụ truy vấn và nhanh hơn nhiều.

+0

Điều cần biết. Cảm ơn. – Josh

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