হালনাগাদ:
আমার ব্লগে এই নিবন্ধগুলি আরও বিস্তারিতভাবে পদ্ধতির মধ্যে পার্থক্য বর্ণনা করে:
এই জাতীয় একটি কোয়েরি করার জন্য তিনটি উপায় রয়েছে:
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 হ্যাশ করার পক্ষে অত্যন্ত বড় হয়)