Sử dụng EXISTS
biểu thức:
WHERE NOT EXISTS (
SELECT FROM votes v -- SELECT list can be empty
WHERE v.some_id = base_table.some_id
AND v.user_id = ?
)
Sự khác biệt
... giữa NOT EXISTS()
(Ⓔ) và NOT IN()
(Ⓘ) gấp đôi:
-
Hiệu suất
Ⓔ nói chung là nhanh hơn. Nó ngừng xử lý truy vấn con ngay khi tìm thấy kết quả phù hợp đầu tiên. Hướng dẫn sử dụng:
Truy vấn con thường sẽ chỉ được thực thi đủ lâu để xác định xem có ít nhất một hàng được trả về hay không, chứ không phải tất cả các cách để hoàn thành.
Ⓘ cũng có thể được tối ưu hóa bởi trình lập kế hoạch truy vấn, nhưng ở mức độ thấp hơn vì
NULL
việc xử lý làm cho nó phức tạp hơn. -
Tính đúng đắn
Nếu một trong các giá trị kết quả trong biểu thức truy vấn con là
NULL
, kết quả của Ⓘ làNULL
, trong khi logic thông thường sẽ mong đợiTRUE
- và Ⓔ sẽ trả vềTRUE
. Hướng dẫn sử dụng:Nếu tất cả các kết quả trên mỗi hàng là không bằng nhau hoặc bằng rỗng, với ít nhất một giá trị rỗng, thì kết quả là
NOT IN
là null.
Về cơ bản, (NOT) EXISTS
là lựa chọn tốt hơn trong hầu hết các trường hợp.
Ví dụ
Truy vấn của bạn có thể trông giống như sau:
SELECT *
FROM questions q
WHERE NOT EXISTS (
SELECT FROM votes v
WHERE v.question_id = q.id
AND v.user_id = ?
);
Đ ừng tham gia vào votes
trong truy vấn cơ sở. Điều đó sẽ làm mất công sức.
Bên cạnh đó NOT EXISTS
và NOT IN
có các tùy chọn cú pháp bổ sung với LEFT JOIN / IS NULL
và EXCEPT
. Xem:
- Chọn các hàng không có trong bảng khác