অস্তিত্ব নেই * নির্বাচন করুন


96

আমি মনে করি আমি এইটির সাথে সঠিক পথে যাচ্ছি ... আমার এসকিউএল সবচেয়ে বড় নয় বলে আমার সাথে থাকুন

আমি একটি টেবিল থেকে সমস্ত ঘর নির্বাচন করতে যেখানে একটি ডাটাবেসকে জিজ্ঞাসা করার চেষ্টা করছি যেখানে অন্য কোনও কোষের অস্তিত্ব নেই। এটি অনেক কিছুই বোঝায় না তবে আমি আশা করি কোডের এই অংশটি হবে

SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

সুতরাং মূলত আমার কাছে কর্মীদের তালিকা এবং তাদের বিশদ সহ একটি টেবিল রয়েছে। তারপরে তাদের নাম সহ আরও কিছু বিশদ সহ একটি সারণী। যেখানে নাম eotm_dyn টেবিলে নেই, যার অর্থ তাদের জন্য কোনও প্রবেশ নেই, আমি দেখতে চাই তারা ঠিক কে, বা অন্য কথায়, ঠিক কী অনুপস্থিত তা দেখুন।

উপরের ক্যোয়ারীটি কিছুই দেয় না, তবে আমি জানি 20 টি নাম নিখোঁজ রয়েছে সুতরাং আমি অবশ্যই এটি সঠিকভাবে অর্জন করতে পারি নি।

কেউ সাহায্য করতে পারেন?

উত্তর:


163

আপনি আপনার প্রশ্নের সারণিতে যোগদান করেন নি।

আপনার মূল ক্যোয়ারী সবসময় কিছুই ফিরিয়ে দেবে না যদি না কোনও রেকর্ড না থাকে তবে সেক্ষেত্রে eotm_dynএটি সবকিছু ফিরিয়ে দেবে।

এই টেবিলগুলিতে যোগ দেওয়া উচিত বলে ধরে নিচ্ছেন employeeID, নিম্নলিখিতগুলি ব্যবহার করুন:

SELECT  *
FROM    employees e
WHERE   NOT EXISTS
        (
        SELECT  null 
        FROM    eotm_dyn d
        WHERE   d.employeeID = e.id
        )

আপনি কোনও LEFT JOINকীওয়ার্ড সহ এই টেবিলগুলিতে যোগদান করতে পারেন এবং এর ফিল্টার আউট করতে পারেন NULLতবে এটি সম্ভবত ব্যবহারের চেয়ে কম দক্ষ হবে NOT EXISTS


31
আমার বছরে দুবার "WHERE NOT WHISE" দরকার এবং আমি কীভাবে এটি সঠিকভাবে ব্যবহার করতে পারি তা সবসময় ভুলে যাই। ধন্যবাদ - এই উদাহরণটি এখন বুকমার্ক করা হবে।
মতেং

4
কেউ কি দয়া করে "বাম জয়েন্ট + নল ফিল্টার অস্তিত্বের চেয়ে কম দক্ষ" এর জন্য একটি রেফারেন্স দিতে পারেন? এটি সুস্পষ্ট হতে পারে, তবে আমি কখনই এটি ডক্সে দেখিনি। ধন্যবাদ
toni07

4
@ টনি07 আসলে এটি কিংবদন্তি। বাম যোগ জয়। explainextended.com/2009/09/18/... .. Quassnoi এর ব্লগ সবসময় একটি সহায়ক সম্পদ।
কাইই

আমি কীভাবে এটি একটি বিপ্লব অনুচ্ছেদে ব্যবহার করব? ওরফেgroup by X having exist [row with employeeID = e.id]
ফিলি 294

@ ব্লাউহিরন: ঠিক তেমনই
কাসনসুই

84
SELECT * FROM employees WHERE name NOT IN (SELECT name FROM eotm_dyn)

বা

SELECT * FROM employees WHERE NOT EXISTS (SELECT * FROM eotm_dyn WHERE eotm_dyn.name = employees.name)

বা

SELECT * FROM employees LEFT OUTER JOIN eotm_dyn ON eotm_dyn.name = employees.name WHERE eotm_dyn IS NULL

4
এনবি! NOT INকাজ না করে প্রত্যাশিত যদি nameগেছে nullমান। ভিডিওতে 36 মিনিট 20 সেকেন্ড থেকে দেখুন সেশন : 10 টিউনিং করার কৌশলগুলি প্রতিটি এসকিউএল প্রোগ্রামারকে জানা উচিত (কেভিন ক্লিন, অ্যারন বার্ট্র্যান্ড)
hlovdal

12

আপনি একটি বাম যোগদান করতে পারেন এবং জোড় করা কলামটি নুল হ'ল

উদাহরণ:

SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL

8
SELECT * from employees
WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

eotm_dynখালি না হলে কোনও রেকর্ড ফেরত দেয় না । আপনার SELECT name FROM eotm_dynপছন্দ মত কিছু ধরণের মানদণ্ড প্রয়োজন

SELECT * from employees
WHERE NOT EXISTS (
    SELECT name FROM eotm_dyn WHERE eotm_dyn.employeeid = employees.employeeid
)

ধরে নিচ্ছি যে দুটি টেবিল বিদেশী কী সম্পর্কের দ্বারা সংযুক্ত রয়েছে। এই মুহুর্তে আপনি একটি বাম যোগদান সহ বিভিন্ন অপশন ব্যবহার করতে পারেন। তবে অপ্টিমাইজার সাধারণত বেশিরভাগ ক্ষেত্রে এগুলি হ্যান্ডেল করবে।


4

আপনি এই সম্পর্কিত প্রশ্নটি একবার দেখতে পারেন । এই ব্যবহারকারী রিপোর্ট করেছেন যে একটি জয় ব্যবহার করে একটি সাব কোয়েরি ব্যবহারের চেয়ে আরও ভাল পারফরম্যান্স সরবরাহ করে।

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