পোস্টগ্রিএসকিউএল 'নট ইন' এবং সাবকোয়ারি


91

আমি এই ক্যোয়ারীটি কার্যকর করার চেষ্টা করছি:

SELECT mac, creation_date 
FROM logs 
WHERE logs_type_id=11
AND mac NOT IN (select consols.mac from consols)

তবে আমি কোনও ফল পাই না। আমি এটি পরীক্ষা করেছি এবং আমি জানি যে সিনট্যাক্সে কিছু ভুল আছে। মাইএসকিউএলে এই জাতীয় একটি কোয়েরি সঠিকভাবে কাজ করে। টেবিলে macঅস্তিত্ব নেই এমন একটি নিশ্চিত করার জন্য আমি একটি সারি যুক্ত করেছি consols, তবে এখনও এটি কোনও ফল দিচ্ছে না।


4
কি consols.macকলাম NULLবা NOT NULL?
মার্ক বাইয়ার্স

উত্তর:


169

নট ইন ব্যবহার করার সময় আপনার নিশ্চিত হওয়া উচিত যে মানগুলির কোনওটিই নাল নয়:

SELECT mac, creation_date 
FROM logs 
WHERE logs_type_id=11
AND mac NOT IN (
    SELECT mac
    FROM consols
    WHERE mac IS NOT NULL -- add this
)

4
দ্রষ্টব্য: WHERE mac IS NOT NULLসাবকোয়ারিতে ধারাটি প্রয়োজন হয় না, যেহেতু In(...)সর্বদা NULLs (এবং সদৃশগুলি) সরিয়ে দেয়। কারণ একটি সেটে
NULL

7
@ wildplasser- এ সম্পর্কে আমি জানি না। এটা আমার জন্য কাজ করছে না হয়, যতক্ষণ না আমি যোগ IS NOT NULL। নেস্টেড SELECTকয়েকজন ফিরছিল NULLS, এবং এটি ট্রিপ আপ ছিল IN(SELECT...)
রবিন 35

4
কেন এটি IS NOT NULLকাজ করে তার কারণ সম্পর্কে আমি একটি ব্যাখ্যাটির প্রশংসা করব ।
এমবারখাউ

7
এটি প্রদর্শিত হয় যে NULLএকটি NOT INধারা ব্যবহার করা কার্যকর হয় না কারণ তুলনাটি NULLসত্য বা মিথ্যা নয়। sqlbadpractices.com/ using
not-

4
is not nullসাবকিউরিটি কোনও মিলের মান এবং কমপক্ষে একটি nullমান তৈরি করে না হলে ক্যোয়ারীর অভাবে কোনও সারি ফেরত দেবে না । বর্তমানের (সংস্করণ 10) পোস্টগ্রিজ এসকিউএল ম্যানুয়ালটির 9.22 ধারা থেকে : "[…] যদি ডান হাতের সমান মান না থাকে এবং কমপক্ষে একটি ডান-হাত সারি ফলন বাতিল হয় তবে নন-ইন নির্মাণের ফলাফলটি বাতিল হবে, সত্য নয় "
ক্রিস্টোফার লুইস

29

নট ইন ব্যবহার করার সময়, আপনাকে নোট অস্তিত্বের কথাও বিবেচনা করা উচিত, যা নালাগুলি নাল কেসগুলি পরিচালনা করে। আরও দেখুন পোস্টগ্রি উইকি

SELECT mac, creation_date 
FROM logs lo
WHERE logs_type_id=11
AND NOT EXISTS (
  SELECT *
  FROM consols nx
  WHERE nx.mac = lo.mac
  );

4
NOT EXISTSবনাম... NOT IN
IkanDivideBy0

4
@ IcanDivideBy0 বেশিরভাগ ক্ষেত্রে তারা একই ক্যোয়ারী প্ল্যান উত্পন্ন করে। আপনি এটি পরীক্ষা করেছেন?
ওয়াইল্ডপ্লেজার

4
সাবকিউরিসের ক্ষেত্রে নোট অস্তিত্বের পরিবর্তে নট ইন ব্যবহার করার ক্ষেত্রেও পারফরম্যান্স লাভ রয়েছে। দেখুন wiki.postgresql.org/wiki/Don%27t_Do_This#Don.27t_use_NOT_IN
Gerbrand

8

আপনি একটি বাম যোগদান এবং নাল শর্তটি ব্যবহার করতে পারেন:

SELECT 
  mac, 
  creation_date 
FROM 
  logs
    LEFT JOIN consols ON logs.mac = consols.mac
WHERE 
  logs_type_id=11
AND
  consols.mac IS NULL;

"ম্যাক" কলামগুলিতে একটি সূচি কার্যকারিতা উন্নত করতে পারে।

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