ছাড়াই অপারেটর বনাম নয়


19

EXCEPTঅপারেটর SQL সার্ভার 2005 সালে চালু করা হয় কিন্তু এর মধ্যে পার্থক্য কি NOT INএবং EXCEPT?

এটি কি একই কাজ করে? আমি একটি উদাহরণ সহ একটি সহজ ব্যাখ্যা চাই।

উত্তর:


29

তার মাঝে দু 'টি মূল পার্থক্য আছে EXCEPTএবং NOT IN

ছাড়া

EXCEPTDISTINCTবাম-হাতের টেবিল থেকে মানগুলি ফিল্টার করে যা ডান-হাতের টেবিলটিতে উপস্থিত হয় না। এটি মূলত NOT EXISTSএকটি DISTINCTধারা দিয়ে একটি করার মতোই ।

এটি কোয়েরির বাম এবং ডানদিকে দুটি সারণী (বা টেবিলগুলি থেকে কলামগুলির উপসেট) একই সংখ্যার কলামের প্রত্যাশা করে

উদাহরণস্বরূপ, আপনি এটি করতে পারবেন না:

SELECT ID, Name FROM TableA
EXCEPT
SELECT ID FROM TableB

এর ফলে ত্রুটি হতে পারে:

একটি ইউনিয়ন, ইন্টারস্যাক্ট বা এক্সসিএপিটি অপারেটর ব্যবহার করে মিলিত সমস্ত ক্যোয়ারির অবশ্যই তাদের লক্ষ্য তালিকাগুলিতে সমান সংখ্যার অভিব্যক্তি থাকতে হবে।

না

NOT INDISTINCTমানগুলির জন্য ফিল্টার করে না এবং বাম-হাতের টেবিল থেকে সমস্ত মান ফিরিয়ে দেয় যা ডান-হাতের টেবিলটিতে উপস্থিত হয় না।

NOT IN আপনার একটি টেবিল থেকে একটি সারণী অন্য টেবিল বা উপকৌটির একটি একক কলামের সাথে তুলনা করতে হবে।

উদাহরণস্বরূপ, যদি আপনার subquery একাধিক কলাম ফেরত ছিল:

SELECT * FROM TableA AS nc
WHERE ID NOT IN (SELECT ID, Name FROM TableB AS ec)

আপনি নিম্নলিখিত ত্রুটি পেতে চাই:

যখন উপস্থিত সাবকিউরিটি উপস্থিতিগুলির সাথে পরিচয় করা হয় না তখন কেবলমাত্র একটি তালিকা নির্বাচন তালিকাতে নির্দিষ্ট করা যায়।

তবে, যদি ডান-হাতের টেবিলটিতে NULLফিল্টার করা মানগুলিতে একটি থাকে NOT IN, একটি খালি ফলাফল সেটটি ফিরে আসে, সম্ভাব্যভাবে অপ্রত্যাশিত ফলাফল দেয়।

EXAMPLE টি

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এবং গাইল শ এর ব্লগে দুটির মধ্যে একটি ভাল তুলনা রয়েছে ।


যথাযথ হলে কি ছাড়বে সূচকগুলি ব্যবহার করবে?
জনঅপিনিকার

1

মার্ক সিনকিনসনের দুর্দান্ত মন্তব্যে একটি আসক্তি:

প্রয়োজন নেই আপনাকে অন্য টেবিল বা উপকৌটির একটি একক কলামের সাথে এক টেবিলের একটি কলামের তুলনা করতে হবে।

আপনি আসলে 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কর্মচারী এমন সমস্ত লোকের জন্য, তবে তারা পরিচালকও নয়।

*: তবে এসকিউএল সার্ভারে নির্মাণটি এখনও কার্যকর হয়নি।


-2

উপরের নয়টি ব্যর্থ হয়েছে কারণ মূল ক্যোয়ারী এবং উপকোয়্যারিতে ভবিষ্যদ্বাণীকারীদের মধ্যে একটি সম্পর্ক থাকতে হবে। আপনি যদি এটিকে ছেড়ে দেন তবে আপনি একটি অনাদায়ী সাব-কোয়েরি পাবেন।

সারণী থেকে * এনসি যেখানে আইডি নেই তে নির্বাচন করুন (আইডি নির্বাচন করুন, যেমন টেবিল থেকে এনসিআইডি = ইসিআইডি থেকে নাম নির্বাচন করুন)

ছাড় ছাড়াই ভাল এবং কোনও নাল সারি হ্যান্ডেল করবে না নাল / এটি নাল পূর্বাভাস দেয় না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.