এসকিউএল কোয়েরি অন্য সারণীতে নয় আইডি সহ রেকর্ড সন্ধান করতে


123

আমার কাছে ডাটাবেসে বাঁধার প্রাথমিক কী সহ দুটি টেবিল রয়েছে এবং আমি তাদের মধ্যে একটি বিভেদ সেট সন্ধান করতে চাই। উদাহরণ স্বরূপ,

  • Table1কলাম ( ID, Name) এবং নমুনা ডেটা রয়েছে:(1 ,John), (2, Peter), (3, Mary)
  • Table2কলাম ( ID, Address) এবং নমুনা ডেটা রয়েছে:(1, address2), (2, address2)

সুতরাং কিভাবে তাই আমি আইডি দিয়ে সারি সংগ্রহ করতে পারে থেকে আমি একটি SQL কোয়েরি তৈরি করব table1যে নেই table2। এই ক্ষেত্রে, (3, Mary)ফেরত দেওয়া উচিত?

পুনশ্চ. এই দুটি টেবিলের প্রাথমিক পরিচয় আইডি key

আগাম ধন্যবাদ.


3
ভবিষ্যতের প্রশ্নের টিপ হিসাবে: আপনি কোন ডাটাবেস সিস্টেমটি (এবং সেই ডেটাবেজের কোন সংস্করণ) ব্যবহার করছেন তা সর্বদা নির্ধারণ করুন। এসকিউএল হ'ল বেশিরভাগ ডাটাবেস সিস্টেমগুলির দ্বারা ব্যবহৃত স্ট্রাকচার্ড ক্যোয়ারী ল্যাঙ্গুয়েজ - যা আসলে খুব বেশি সাহায্য করে না ... প্রায়শই, ডাটাবেসগুলিতে এএনএসআই / আইএসও এসকিউএল স্ট্যান্ডার্ডকে ছাড়িয়ে এক্সটেনশন এবং বৈশিষ্ট্য রয়েছে যা সমস্যার সমাধান সহজ করে তোলে - তবে তার জন্য আপনি আপনি কোন ডাটাবেসটি ব্যবহার করছেন তা আমাদের জানানোর দরকার
marc_s

5
@মার্ক_স: তারা যদি একাধিক অন্তর্নিহিত ডাটাবেস সিস্টেম সমর্থন করার প্রয়োজন হয় বা ডেটাবেস বাস্তবায়ন বিমূর্ত হয়ে যায়, তবে তারা যদি ভাষা-অজ্ঞান সম্পর্কিত সমাধান খুঁজছেন?
ডোয়ান্ডারসন

হাই @marc_s, আমি এই ক্ষেত্রে পোস্টগ্রেএসকিউএল ব্যবহার করছি। মনে করিয়ে দেওয়ার জন্য ধন্যবাদ।
জনকলি

উত্তর:


213

এটা চেষ্টা কর

SELECT ID, Name 
FROM   Table1 
WHERE  ID NOT IN (SELECT ID FROM Table2)

8
@ প্রিন্সজিয়া আসলে এটি নির্ভর করে। স্পষ্টতার জন্য এখানে দেখুন
জন উ

আমার কাছে যখন 20 টি ড্যাটাস রয়েছে, এটি কাজ করে, তবে যখন আমার 20000 ড্যাটাস রয়েছে, এটি কাজ করে না, আইএম এখন বিভ্রান্ত।
ফ্র্যাঙ্ক

1
কোন ধারণা নেই তবে এটি কাজ করছে না। আমার টেবিলে প্রায় 10000 সারি রয়েছে। আমার ক্ষেত্রে @ জনউ এর সমাধান ঠিক কাজ করেছে।
মুনাম ইউসুফ

4
এটা আমরাও অনেক মান কাজ করবে না "-এর না" যেহেতু এই পদ্ধতি মান একটি সীমিত সংখ্যক আছে CF: dba-oracle.com/t_maximum_number_of_sql_in_list_values.htm
G.Busato

2
আমাকে এটি করতে হয়েছিল: আমি টেবিল 1 থেকে আমি যেখানে নির্বাচন করি না সেখান থেকে নির্বাচন করুন (আমি টেবিল 2 থেকে নির্বাচন করুন যেখানে আমি নাল নই ) এবং আমি শূন্য
নই


12

সেখানে মূলত যে 3 পন্থা হল: not exists, not inএবং left join / is null

বাম যোগদান করুন নাল সাথে

SELECT  l.*
FROM    t_left l
LEFT JOIN
        t_right r
ON      r.value = l.value
WHERE   r.value IS NULL

না

SELECT  l.*
FROM    t_left l
WHERE   l.value NOT IN
        (
        SELECT  value
        FROM    t_right r
        )

বিদ্যমান না

SELECT  l.*
FROM    t_left l
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    t_right r
        WHERE   r.value = l.value
        )

কোনটা ভালো? এই নির্দিষ্ট প্রশ্নের উত্তরটি নির্দিষ্ট নির্দিষ্ট আরডিবিএমএস বিক্রেতাদের কাছে ভেঙে ফেলা ভাল। সাধারণভাবে বলতে গেলে, select ... where ... in (select...)সাব-কোয়েরিতে রেকর্ডের সংখ্যার বিশালতা অজানা থাকলে ব্যবহার করা উচিত one কিছু বিক্রেতারা আকার সীমাবদ্ধ করতে পারে। উদাহরণস্বরূপ ওরাকল এর সীমা এক হাজার । করণীয় সর্বোত্তম জিনিস তিনটি চেষ্টা করে দেখুন এবং কার্যকর করার পরিকল্পনাটি দেখান।

বিশেষত PostgreSQL গঠন করুন, এর এক্সিকিউশন প্ল্যান NOT EXISTSএবং LEFT JOIN / IS NULLএকই রকম। আমি ব্যক্তিগতভাবে NOT EXISTSবিকল্পটি পছন্দ করি কারণ এটি আরও ভাল উদ্দেশ্য দেখায়। সব পরে শব্দার্থিক যে আপনি একটি রেকর্ড যে তার PK খুঁজতে চান উপস্থিত না থাকার বি

পুরাতন তবে এখনও সোনার, যদিও পোস্টগ্রাএসকিউএল-তে নির্দিষ্ট: https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/


10

দ্রুত বিকল্প

আমি প্রতিটি টেস্টে (M .৫ পোস্টে) দুটি টেবিল ব্যবহার করে প্রতি M 2M সারি ব্যবহার করেছি। প্রস্তাবিত অন্যান্য প্রশ্নের তুলনায় নীচে এই কোয়েরিটি কমপক্ষে 5 * ভাল সম্পাদন করেছে:

-- Count
SELECT count(*) FROM (
    (SELECT id FROM table1) EXCEPT (SELECT id FROM table2)
) t1_not_in_t2;

-- Get full row
SELECT table1.* FROM (
    (SELECT id FROM table1) EXCEPT (SELECT id FROM table2)
) t1_not_in_t2 JOIN table1 ON t1_not_in_t2.id=table1.id;

1
এটি @ জন উ এর সমাধানের চেয়ে দ্রুত ছিল না। আমি পোস্টগ্রিস 9.6 ব্যবহার করছি এবং ঝনের সমাধানের সময়টি 60 মিমি সহ। যদিও আমি এই সমাধানটি 120 সেকেন্ডের পরেও পেয়েছি এবং কোনও ফলাফল নেই।
froy001

5

উপরের @ জন উনের মন্তব্য / লিঙ্কে তৈরি পয়েন্টগুলি মাথায় রেখে, আমি সাধারণত এটি পরিচালনা করব:

SELECT t1.ID, t1.Name 
FROM   Table1 t1
WHERE  NOT EXISTS (
    SELECT TOP 1 NULL
    FROM Table2 t2
    WHERE t1.ID = t2.ID
)

2
SELECT COUNT(ID) FROM tblA a
WHERE a.ID NOT IN (SELECT b.ID FROM tblB b)    --For count


SELECT ID FROM tblA a
WHERE a.ID NOT IN (SELECT b.ID FROM tblB b)    --For results
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.