সারণিগুলি নির্বাচন করুন যা অন্য সারণীতে উপস্থিত নেই


172

আমি দুটি পোস্টগ্র্যাস্কিল টেবিল পেয়েছি:

table name     column names
-----------    ------------------------
login_log      ip | etc.
ip_location    ip | location | hostname | etc.

আমি প্রতিটি আইপি ঠিকানা পেতে চাই login_logযা থেকে কোনও সারি নেই ip_location
আমি এই কোয়েরিটি চেষ্টা করেছিলাম তবে এটি একটি সিনট্যাক্স ত্রুটি ছুড়ে ফেলেছে।

SELECT login_log.ip 
FROM login_log 
WHERE NOT EXIST (SELECT ip_location.ip
                 FROM ip_location
                 WHERE login_log.ip = ip_location.ip)
ERROR: syntax error at or near "SELECT"
LINE 3: WHERE NOT EXIST (SELECT ip_location.ip`

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

উত্তর:


386

এই কাজের জন্য মূলত 4 টি কৌশল রয়েছে, এগুলির সবকটিই স্ট্যান্ডার্ড এসকিউএল।

NOT EXISTS

পোস্টগ্র্রেসে প্রায়শই দ্রুত।

SELECT ip 
FROM   login_log l 
WHERE  NOT EXISTS (
   SELECT  -- SELECT list mostly irrelevant; can just be empty in Postgres
   FROM   ip_location
   WHERE  ip = l.ip
   );

এছাড়াও বিবেচনা করুন:

LEFT JOIN / IS NULL

কখনও কখনও এটি দ্রুততম হয়। প্রায়শই সংক্ষিপ্ততম। প্রায়শই একই ক্যোয়ারী পরিকল্পনার ফলাফল NOT EXISTS

SELECT l.ip 
FROM   login_log l 
LEFT   JOIN ip_location i USING (ip)  -- short for: ON i.ip = l.ip
WHERE  i.ip IS NULL;

EXCEPT

সংক্ষিপ্ত। আরও জটিল প্রশ্নগুলিতে সহজেই সংহত হয় না।

SELECT ip 
FROM   login_log

EXCEPT ALL  -- "ALL" keeps duplicates and makes it faster
SELECT ip
FROM   ip_location;

নোট করুন ( প্রতি ডকুমেন্টেশন ):

সদৃশগুলি EXCEPT ALLব্যবহার না করা হয় তবে তা মুছে ফেলা হয়।

সাধারণত, আপনি ALLকীওয়ার্ডটি চাইবেন । আপনি যদি যত্ন না পান তবে এখনও এটি ব্যবহার করুন কারণ এটি ক্যোয়ারীটিকে আরও দ্রুত করে তোলে ।

NOT IN

NULLমান ছাড়া কেবল ভাল বা আপনি যদি NULLসঠিকভাবে পরিচালনা করতে জানেন তবে । আমি এই উদ্দেশ্যে এটি ব্যবহার করব নাএছাড়াও, বড় টেবিলগুলির সাথে কর্মক্ষমতা খারাপ হতে পারে।

SELECT ip 
FROM   login_log
WHERE  ip NOT IN (
   SELECT DISTINCT ip  -- DISTINCT is optional
   FROM   ip_location
   );

NOT INNULLউভয় পক্ষের মানগুলির জন্য একটি "ফাঁদ" বহন করে :

মাইএসকিউএল লক্ষ্যবস্তু ডিবিএএসইতে অনুরূপ প্রশ্ন:


2
উভয় সারণীতে ডেটা ভলিউম বেশি হওয়ায় কোন এসকিউএল দ্রুত চলবে run (বিলিয়নে অনুমান)
তেজা

সমস্ত ছাড়াই আমার পক্ষে দ্রুত ছিল
ড্যান পার্কার

সতর্কতা অবলম্বন করুন LEFT JOIN- যদি সন্ধানের সারণিতে একাধিক মিলের সারি থাকে, তবে এটি প্রতিটি মিলে যাওয়া সারিটির জন্য আপনার মূল ক্যোয়ারিতে একটি সদৃশ এন্ট্রি তৈরি করবে, যা নাও চাওয়া যেতে পারে।
ম্যাথিয়াস ফ্রিপ

@ মাথিয়াসফ্রিপ: ব্যতীত এটি কখনও ঘটতে পারে না WHERE i.ip IS NULL, অর্থাত কোনও মিল নেই
এরউইন ব্র্যান্ডসেটেটার

@ ইরভিন-ব্র্যান্ডসেট্টার: ভাল পয়েন্ট। আমি একাধিক ইতিবাচক ম্যাচের সম্ভাবনা সম্পর্কে ভেবে নিজেকে ছুঁড়ে ফেলেছি তবে অবশ্যই সেগুলি বাদ দেওয়া হবে।
ম্যাথিয়াস ফ্রিপ

2

উ। কমান্ডটি বিদ্যমান নেই, আপনি 'এস' মিস করছেন।

খ) পরিবর্তে না ব্যবহার করুন

SELECT ip 
  FROM login_log 
  WHERE ip NOT IN (
    SELECT ip
    FROM ip_location
  )
;

4
বড় ডেটাসেটগুলিতে নয় একটি ভয়ানক ধারণা। খুব, খুব ধীর। এটি খারাপ এবং এড়ানো উচিত।
গ্রেজগোর্জ গ্র্যাবাক

0

SELECT * FROM testcases1 t WHERE NOT EXISTS ( SELECT 1
FROM executions1 i WHERE t.tc_id = i.tc_id and t.pro_id=i.pro_id and pro_id=7 and version_id=5 ) and pro_id=7 ;

এখানে টেস্টকেসেস 1 টেবিলে সমস্ত ডেটা থাকে এবং এক্সিকিউশন 1 টেবিলটিতে টেস্টকেসেস 1 টেবিলের মধ্যে কিছু ডেটা থাকে। আমি কেবলমাত্র ডেটাগুলি উদ্ধার করছি যা এক্সিকিউশন 1 টেবিলটিতে নেই। (এবং এমনকি আমি ভিতরে কিছু শর্ত দিচ্ছি যা আপনিও দিতে পারেন)) শর্তটি নির্দিষ্ট করুন যা ডেটা পুনরুদ্ধারে সেখানে থাকা উচিত নয় বন্ধনীর ভিতরে থাকা উচিত।


0

এটিও চেষ্টা করা যেতে পারে ...

SELECT l.ip, tbl2.ip as ip2, tbl2.hostname
FROM   login_log l 
LEFT   JOIN (SELECT ip_location.ip, ip_location.hostname
             FROM ip_location
             WHERE ip_location.ip is null)tbl2

2
WHERE ip_location.ip is null- WHEREঅবস্থাটি কীভাবে সত্য হতে পারে? এছাড়াও, সাব-কোয়েরিটি একটি সম্পর্কিত সম্পর্কযুক্ত নয়।
ইসতিয়াক আহমেদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.