โดยทั่วไปมี 3 วิธีการว่าnot exists
, และnot in
left join / is null
ซ้ายเข้าร่วมกับ IS NULL
SELECT l.*
FROM t_left l
LEFT JOIN
t_right r
ON r.value = l.value
WHERE r.value IS NULL
ไม่ได้อยู่ใน
SELECT l.*
FROM t_left l
WHERE l.value NOT IN
(
SELECT value
FROM t_right r
)
ไม่มีอยู่
SELECT l.*
FROM t_left l
WHERE NOT EXISTS
(
SELECT NULL
FROM t_right r
WHERE r.value = l.value
)
อันไหนดีกว่า? คำตอบสำหรับคำถามนี้อาจจะดีกว่าหากแยกย่อยไปยังผู้ให้บริการ RDBMS รายใหญ่โดยเฉพาะ โดยทั่วไปเราควรหลีกเลี่ยงการใช้select ... where ... in (select...)
เมื่อไม่ทราบขนาดของจำนวนระเบียนในแบบสอบถามย่อย ผู้ขายบางรายอาจ จำกัด ขนาด Oracle, ตัวอย่างเช่นมีวงเงิน 1,000 สิ่งที่ดีที่สุดที่ควรทำคือลองทั้งสามอย่างและแสดงแผนการดำเนินการ
รูปแบบเฉพาะของ PostgreSQL แผนการดำเนินการNOT EXISTS
และLEFT JOIN / IS NULL
เหมือนกัน ฉันชอบNOT EXISTS
ตัวเลือกนี้เป็นการส่วนตัวเพราะแสดงเจตนาได้ดีกว่า หลังจากที่ทุกความหมายก็คือว่าคุณต้องการที่จะหาระเบียนในที่ PK มันไม่ได้อยู่ใน B
เก่า แต่ยังคงเป็นสีทองเฉพาะสำหรับ PostgreSQL แม้ว่า: https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/