হালনাগাদ:
আমার ব্লগে এই নিবন্ধগুলি আরও বিস্তারিতভাবে পদ্ধতির মধ্যে পার্থক্য বর্ণনা করে:
এই জাতীয় একটি কোয়েরি করার জন্য তিনটি উপায় রয়েছে:
LEFT JOIN / IS NULL:
SELECT *
FROM common
LEFT JOIN
table1 t1
ON t1.common_id = common.common_id
WHERE t1.common_id IS NULL
NOT EXISTS:
SELECT *
FROM common
WHERE NOT EXISTS
(
SELECT NULL
FROM table1 t1
WHERE t1.common_id = common.common_id
)
NOT IN:
SELECT *
FROM common
WHERE common_id NOT IN
(
SELECT common_id
FROM table1 t1
)
যখন table1.common_idঅণনীয় হয় না, এই সমস্ত প্রশ্নগুলি শব্দার্থতভাবে একই।
যখন এটি অলক্ষিত হয় তখন NOT INআলাদা হয়, যেহেতু IN(এবং, অতএব NOT IN) ফিরে আসে NULLযখন একটি যুক্ত একটি তালিকার সাথে কোনও মান মেলে না NULL।
এটি বিভ্রান্তিকর হতে পারে তবে আমরা যদি এর বিকল্প বিকল্প বাক্যটি স্মরণ করি তবে আরও স্পষ্ট হয়ে উঠতে পারে:
common_id = ANY
(
SELECT common_id
FROM table1 t1
)
এই অবস্থার ফলাফল তালিকার মধ্যে সমস্ত তুলনার একটি বুলিয়ান পণ্য। অবশ্যই, একটি একক NULLমান NULLফলাফল দেয় যা পুরো ফলাফলকেও সরবরাহ করে NULL।
আমরা কখনোই স্পষ্টভাবে বলতে পারবে না যে common_idএই তালিকা থেকে কিছু সমান নয়, যেহেতু মূল্যবোধের অন্তত এক NULL।
ধরুন আমাদের কাছে এই ডেটা রয়েছে:
common
--
1
3
table1
--
NULL
1
2
LEFT JOIN / IS NULLএবং NOT EXISTSফিরে আসবে 3, NOT INফিরে আসবে কিছুই (যেহেতু এটা সবসময় উভয় মূল্যায়ন করবে FALSEবা NULL)।
ইন MySQL-অ্যালবামযোগ্য কলামে, LEFT JOIN / IS NULLএবং NOT INএর চেয়ে কিছুটা সামান্য (বেশ কয়েকটি শতাংশ) বেশি দক্ষ NOT EXISTS। কলামটি যদি অযোগ্য NOT EXISTSহয় তবে সর্বাধিক দক্ষ (আবার, খুব বেশি নয়)।
ইন Oracle, তিনটি প্রশ্নেরই একই পরিকল্পনা পাওয়া যায় (এ ANTI JOIN)।
ইন SQL Server, NOT IN/ NOT EXISTSআরও দক্ষ, যেহেতু এটির অপ্টিমাইজারটি LEFT JOIN / IS NULLকোনও ANTI JOINদ্বারা অনুকূলিত হতে পারে না ।
ইন PostgreSQL, LEFT JOIN / IS NULLএবং NOT EXISTSঅধিক কার্যকরী হয় NOT IN, সাইন তারা একটি থেকে অপ্টিমাইজ করা হয় Anti Join, যখন NOT INব্যবহারসমূহ hashed subplan(বা এমনকি একটি প্লেইন subplanযদি subquery হ্যাশ করার পক্ষে অত্যন্ত বড় হয়)