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ì
NULLviệ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 INlà 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