EXCEPT
অপারেটর SQL সার্ভার 2005 সালে চালু করা হয় কিন্তু এর মধ্যে পার্থক্য কি NOT IN
এবং EXCEPT
?
এটি কি একই কাজ করে? আমি একটি উদাহরণ সহ একটি সহজ ব্যাখ্যা চাই।
EXCEPT
অপারেটর SQL সার্ভার 2005 সালে চালু করা হয় কিন্তু এর মধ্যে পার্থক্য কি NOT IN
এবং EXCEPT
?
এটি কি একই কাজ করে? আমি একটি উদাহরণ সহ একটি সহজ ব্যাখ্যা চাই।
উত্তর:
তার মাঝে দু 'টি মূল পার্থক্য আছে EXCEPT
এবং NOT IN
।
EXCEPT
DISTINCT
বাম-হাতের টেবিল থেকে মানগুলি ফিল্টার করে যা ডান-হাতের টেবিলটিতে উপস্থিত হয় না। এটি মূলত NOT EXISTS
একটি DISTINCT
ধারা দিয়ে একটি করার মতোই ।
এটি কোয়েরির বাম এবং ডানদিকে দুটি সারণী (বা টেবিলগুলি থেকে কলামগুলির উপসেট) একই সংখ্যার কলামের প্রত্যাশা করে
উদাহরণস্বরূপ, আপনি এটি করতে পারবেন না:
SELECT ID, Name FROM TableA
EXCEPT
SELECT ID FROM TableB
এর ফলে ত্রুটি হতে পারে:
একটি ইউনিয়ন, ইন্টারস্যাক্ট বা এক্সসিএপিটি অপারেটর ব্যবহার করে মিলিত সমস্ত ক্যোয়ারির অবশ্যই তাদের লক্ষ্য তালিকাগুলিতে সমান সংখ্যার অভিব্যক্তি থাকতে হবে।
NOT IN
DISTINCT
মানগুলির জন্য ফিল্টার করে না এবং বাম-হাতের টেবিল থেকে সমস্ত মান ফিরিয়ে দেয় যা ডান-হাতের টেবিলটিতে উপস্থিত হয় না।
NOT IN
আপনার একটি টেবিল থেকে একটি সারণী অন্য টেবিল বা উপকৌটির একটি একক কলামের সাথে তুলনা করতে হবে।
উদাহরণস্বরূপ, যদি আপনার subquery একাধিক কলাম ফেরত ছিল:
SELECT * FROM TableA AS nc
WHERE ID NOT IN (SELECT ID, Name FROM TableB AS ec)
আপনি নিম্নলিখিত ত্রুটি পেতে চাই:
যখন উপস্থিত সাবকিউরিটি উপস্থিতিগুলির সাথে পরিচয় করা হয় না তখন কেবলমাত্র একটি তালিকা নির্বাচন তালিকাতে নির্দিষ্ট করা যায়।
তবে, যদি ডান-হাতের টেবিলটিতে NULL
ফিল্টার করা মানগুলিতে একটি থাকে NOT IN
, একটি খালি ফলাফল সেটটি ফিরে আসে, সম্ভাব্যভাবে অপ্রত্যাশিত ফলাফল দেয়।
CREATE TABLE #NewCustomers (ID INT);
CREATE TABLE #ExistingCustomers (ID INT);
INSERT INTO #NewCustomers
( ID )
VALUES
(8), (9), (10), (1), (3), (8);
INSERT INTO #ExistingCustomers
( ID )
VALUES
( 1) , (2), (3), (4), (5);
-- EXCEPT filters for DISTINCT values
SELECT * FROM #NewCustomers AS nc
EXCEPT
SELECT * FROM #ExistingCustomers AS ec
-- NOT IN returns all values without filtering
SELECT * FROM #NewCustomers AS nc
WHERE ID NOT IN (SELECT ID FROM #ExistingCustomers AS ec)
উপরের দুটি প্রশ্নের EXCEPT
থেকে #NewCustomers
, 3 টি সারি ফেরত দেয়, 1 এবং 3 যা মেলে #ExistingCustomers
এবং নকল 8 ফিল্টার করে ।
NOT IN
এই স্বতন্ত্র ফিল্টারিং করে না এবং #NewCustomers
সদৃশ 8 দিয়ে 4 টি সারি ফেরত দেয়।
আমরা এখন একটি যুক্ত করে থাকেন NULL
করার #ExistingCustomers
টেবিল, আমরা দ্বারা ফিরে একই ফলাফল দেখতে EXCEPT
, তবে NOT IN
একটি খালি ফলাফল সেট ফিরে আসবে।
INSERT INTO #ExistingCustomers
( ID )
VALUES
( NULL );
-- With NULL values in the right-hand table, EXCEPT still returns the same results as above
SELECT * FROM #NewCustomers AS nc
EXCEPT
SELECT * FROM #ExistingCustomers AS ec
-- NOT IN now returns no results
SELECT * FROM #NewCustomers AS nc
WHERE ID NOT IN (SELECT ID FROM #ExistingCustomers AS ec)
DROP TABLE #NewCustomers;
DROP TABLE #ExistingCustomers;
পরিবর্তে NOT IN
, আপনার সত্যই নজর দেওয়া উচিত NOT EXISTS
এবং গাইল শ এর ব্লগে দুটির মধ্যে একটি ভাল তুলনা রয়েছে ।
মার্ক সিনকিনসনের দুর্দান্ত মন্তব্যে একটি আসক্তি:
প্রয়োজন নেই আপনাকে অন্য টেবিল বা উপকৌটির একটি একক কলামের সাথে এক টেবিলের একটি কলামের তুলনা করতে হবে।
আপনি আসলে NOT IN
একাধিক কলাম দিয়ে পারফর্ম করতে পারেন ।
যেমন এটি একটি প্রাকৃতিক আইনী * এসকিউএল কোয়েরি:
SELECT E.first_name, E.last_name
FROM employees E
WHERE (E.first_name, E.last_name) NOT IN
(SELECT M.first_name, M.last_name FROM managers M)
যা ফিরে আসবে first_name
এবং last_name
কর্মচারী এমন সমস্ত লোকের জন্য, তবে তারা পরিচালকও নয়।
*: তবে এসকিউএল সার্ভারে নির্মাণটি এখনও কার্যকর হয়নি।
উপরের নয়টি ব্যর্থ হয়েছে কারণ মূল ক্যোয়ারী এবং উপকোয়্যারিতে ভবিষ্যদ্বাণীকারীদের মধ্যে একটি সম্পর্ক থাকতে হবে। আপনি যদি এটিকে ছেড়ে দেন তবে আপনি একটি অনাদায়ী সাব-কোয়েরি পাবেন।
সারণী থেকে * এনসি যেখানে আইডি নেই তে নির্বাচন করুন (আইডি নির্বাচন করুন, যেমন টেবিল থেকে এনসিআইডি = ইসিআইডি থেকে নাম নির্বাচন করুন)
ছাড় ছাড়াই ভাল এবং কোনও নাল সারি হ্যান্ডেল করবে না নাল / এটি নাল পূর্বাভাস দেয় না।