Về cơ bản có 3 cách tiếp cận đó: not exists
, not in
và left join / is null
.
THAM GIA TRÁI với IS NULL
SELECT l.*
FROM t_left l
LEFT JOIN
t_right r
ON r.value = l.value
WHERE r.value IS NULL
KHÔNG VÀO
SELECT l.*
FROM t_left l
WHERE l.value NOT IN
(
SELECT value
FROM t_right r
)
KHÔNG TỒN TẠI
SELECT l.*
FROM t_left l
WHERE NOT EXISTS
(
SELECT NULL
FROM t_right r
WHERE r.value = l.value
)
Cái nào tốt hơn? Câu trả lời cho câu hỏi này có thể tốt hơn nếu được chia nhỏ cho các nhà cung cấp RDBMS cụ thể. Nói chung, người ta nên tránh sử dụng select ... where ... in (select...)
khi độ lớn của số lượng bản ghi trong truy vấn con là không xác định. Một số nhà cung cấp có thể giới hạn kích thước. Ví dụ, Oracle có giới hạn 1.000 . Điều tốt nhất cần làm là thử cả ba và hiển thị kế hoạch thực hiện.
Cụ thể hình thức PostgreSQL, kế hoạch thực thi của NOT EXISTS
và LEFT JOIN / IS NULL
giống nhau. Cá nhân tôi thích NOT EXISTS
tùy chọn hơn vì nó cho thấy ý định tốt hơn. Sau tất cả các ngữ nghĩa là bạn muốn tìm các bản ghi trong A mà pk của nó không tồn tại trong B .
Tuy cũ nhưng vẫn còn vàng, dành riêng cho PostgreSQL: https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/