অন্য টেবিলের অস্তিত্ব নেই এমন এক টেবিল থেকে সমস্ত রেকর্ড কীভাবে নির্বাচন করবেন?


469

table1 (আইডি, নাম)
table2 (আইডি, নাম)

প্রশ্ন:

SELECT name   
FROM table2  
-- that are not in table1 already

উত্তর:


843
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL

প্রশ্ন : এখানে কী হচ্ছে?

উত্তর : ধারণাগতভাবে, আমরা সমস্ত সারি নির্বাচন করি table1এবং প্রতিটি সারির জন্য আমরা কলামের table2জন্য একই মান সহ একটি সারি সন্ধান করার চেষ্টা করি name। যদি এরকম কোনও সারি না থাকে, আমরা কেবল table2আমাদের ফলাফলের অংশটি সেই সারির জন্য খালি রাখি । তারপরে আমরা কেবল সেই সারিগুলিকে বাছাই করে আমাদের নির্বাচনকে বাধা দিই যেখানে ফলাফলের সাথে মিলের সারি বিদ্যমান নেই। অবশেষে, আমরা nameকলাম ব্যতীত (আমাদের যে নিশ্চিত যে বিদ্যমান তা থেকে, table1) বাদে আমরা আমাদের ফলাফল থেকে সমস্ত ক্ষেত্রকে উপেক্ষা করি ।

যদিও এটি সব ক্ষেত্রে সবচেয়ে কার্যকর পদ্ধতি নাও হতে পারে তবে এটি এএনএসআই 92 এসকিউএল বাস্তবায়নের চেষ্টা করে এমন প্রতিটি ডাটাবেস ইঞ্জিনে মূলত কাজ করা উচিত should


16
: @ Z-মনিব: এটা এছাড়াও SQL সার্ভার উপর অন্তত performant এর explainextended.com/2009/09/15/...
OMG এর Ponies

7
@ বাঙ্কারবয়: একটি বাম জোড় ডানদিকে সারিগুলি অস্তিত্ব রাখতে দেয় যা বামে সারি অন্তর্ভুক্তিকে প্রভাবিত করে না। অভ্যন্তরীণ যোগদানের জন্য বাম এবং ডানদিকে উপস্থিত থাকতে হবে ows আমি এখানে যা করছি তা মূলত অভ্যন্তরীণ যোগদানের বিপরীত নির্বাচন পেতে কিছু যুক্তি প্রয়োগ করছে।
ক্রিস

2
ওম এটি খুব সহজেই ভিজ্যুয়ালাইজ করতে সহায়তা করেছে, অন্যরা এটি 5 টি বিভিন্ন উপায়ে পছন্দ করেছে তবে এটি সাহায্য করেছিল। সরল: প্রথমে আপনি বাম যোগদান করুন, এ এর ​​সমস্ত কিছু এবং খ এর সাথে যা কিছু মিলবে এ-এর সাথে। তবে বাম জোড়ের ক্ষেত্রগুলিতে যা ঘটে না তা একেবারে শূন্য। তারপরে আপনি বলুন, ঠিক আছে আমি কেবল এগুলি নালার চাই। এইভাবে আপনার A তে সমস্ত সারি রয়েছে যা বি-তে কোনও মিল নেই
মুহাম্মদ উমার

7
এটি দ্রষ্টব্য হওয়া উচিত যে এই সমাধানগুলি (গৃহীত এবং ভোট দেওয়া হয়েছে) কেবলমাত্র এক, আমি মনে করি, এটি এমন এক দৃশ্যের জন্য সম্পাদনা করা যেতে পারে যেখানে একাধিক ক্ষেত্র কার্যকর হয়। বিশেষত, আমি টেবিল এক থেকে ফিল্ড, ফিল্ড 2, ফিল্ড 3 ফিরে আসছি যেখানে ফিল্ড বিজ্ঞাপন ফিল্ড 2 এর সংমিশ্রণটি দ্বিতীয় সারণীতে নেই। এই উত্তরে
যোগদানটি পরিবর্তন করা ছাড়াও,

1
কেবলমাত্র নিশ্চিত হয়ে নিন যে আপনি "WHERE t2.name is NULL" ব্যবহার করেছেন এবং "AND t2.name is NULL" কারণ "এবং" সঠিক ফলাফল দেয় না। আমি সত্যিই বুঝতে পারছি না তবে এটি সত্য, আমি এটি পরীক্ষা করেছি।
ব্যবহারকারী 890332

236

আপনি হয় করতে পারেন

SELECT name
FROM table2
WHERE name NOT IN
    (SELECT name 
     FROM table1)

অথবা

SELECT name 
FROM table2 
WHERE NOT EXISTS 
    (SELECT * 
     FROM table1 
     WHERE table1.name = table2.name)

এটি সম্পাদন করার জন্য 3 টি কৌশলটির জন্য এই প্রশ্নটি দেখুন


38
এটি প্রচুর পরিমাণে ডেটা সহ অবিশ্বাস্যরূপে ধীর।
হালকাবুল 1

হ্যাঁ, সত্যই এটি খুব ধীর
স্যারাস

এটি "টেবিল 1 থেকে" থাকা উচিত নয়, এটি বিদ্যমান কোয়েরির সাবকোয়ারিতে থাকা উচিত।
জ্বালাতন

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

এই একজন আমার জন্য কাজ করেছেন .. আপনাকে ধন্যবাদ
থিম

81

২ য় উত্তরের ভোট দেওয়ার মতো পর্যাপ্ত রেপ পয়েন্ট আমার কাছে নেই। তবে আমি উপরের উত্তরের মন্তব্যগুলির সাথে একমত নই। দ্বিতীয় উত্তর:

SELECT name
FROM table2
WHERE name NOT IN
    (SELECT name 
     FROM table1)

অনুশীলনে আরও দক্ষ আমি জানি না তবে আমি এটি 800k + রেকর্ডের বিপরীতে চালাচ্ছি এবং উপরের পোস্টের দ্বিতীয় উত্তরটি দেওয়া সুবিধাটি দিয়ে পার্থক্যটি দুর্দান্ত। শুধু আমার 0.02 ডলার


30
নোট ইন ক্যোয়ারিতে সাবকিউরিটি একবারেই করা হয়, এক্সস্টের ক্যোয়ারিতে প্রতিটি সারির জন্য সাবকোয়ারি করা হয়
ক্যারিক

1
আপনি দুর্দান্ত ... :) এইভাবে আমি আমার 25 সেকেন্ডের ক্যোয়ারীটি বাম
বাসেম শাহিন

3
উত্তরগুলি কোনও নির্দিষ্ট ক্রমে নয়, সুতরাং দ্বিতীয় উত্তরের অর্থ আপনি যা ভেবেছিলেন তার অর্থ এটি নয়।

38

এটি খাঁটি সেট তত্ত্ব যা minusঅপারেশন দিয়ে আপনি অর্জন করতে পারেন ।

select id, name from table1
minus
select id, name from table2

আপনি কি মনে করেন এটি বাম যোগদানের চেয়ে অনেক দক্ষ?
আহস

এটা করা উচিত. বিয়োগ কমান্ড এই সঠিক পরিস্থিতির জন্য ডিজাইন করা হয়েছে। অবশ্যই কোনও নির্দিষ্ট ডেটা সেটটির বিচার করার একমাত্র উপায় হ'ল উভয় উপায়ে চেষ্টা করে দেখতে এবং কোনটি দ্রুত চলে।
শীতকালীন

9
টি-এসকিউএলে সেট অপারেটরটি "বাদে" is এটি আমার পক্ষে খুব সুবিধাজনক এবং কোনও ধীরগতির কারণ হয়নি।

2
এসকিউএলাইটে, "বিয়োগ" অপারেটরটি "বাদে"।
25:36

মাইএসকিউএল MINUS অপারেটর সমর্থন করে না।
মুহাম্মদ আজিম


16

সমস্যার জন্য সতর্কতা অবলম্বন করুন। ক্ষেত্র তাহলে Nameমধ্যে Table1NULLs ধারণ আপনি চমকের মুখোমুখি হতে যাচ্ছে। আরও ভাল:

SELECT name
FROM table2
WHERE name NOT IN
    (SELECT ISNULL(name ,'')
     FROM table1)

1
কৌলেস> ইসনুল (ইসনুল ভাষা থেকে একটি অকেজো টি-এসকিউএল সংযোজন যা কোলেসের চেয়ে নতুন বা আরও ভাল কিছু করে না)
ক্রিস

14

এখানে আমার পক্ষে সবচেয়ে ভাল কাজ করেছে।

SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID

আমার চেষ্টা করা অন্য পদ্ধতিগুলির তুলনায় এটি দ্বিগুণেরও বেশি দ্রুত ছিল।


ধন্যবাদ, এটি প্রচুর পরিমাণে ডেটা সহ ভাল কাজ করে! তবে আমি কেবল 'বাদ' শব্দটি নিয়ে ভাবছি ering
প্যাটসনলাইনার


7

আমার পক্ষে কাজটি তীক্ষ্ণ

SELECT * 
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL

1

কোয়েরি দেখুন:

SELECT * FROM Table1 WHERE
id NOT IN (SELECT 
        e.id
    FROM
        Table1 e
            INNER JOIN
        Table2 s ON e.id = s.id);

ধারণাটি হ'ল: সাবকোয়রিতে ম্যাচিং রেকর্ডগুলি আনা এবং তারপরে মূল ক্যোয়ারীতে রেকর্ডগুলি আনতে হবে যা সাবকোয়রিতে নেই।


0

আমি সঠিক পোস্টে পুনরায় পোস্ট করতে যাচ্ছি (যেহেতু আমি মন্তব্য করার মতো যথেষ্ট শীতল নই) .... যদি অন্য কেউ মনে করে এর আরও ভাল ব্যাখ্যা করার দরকার আছে।

SELECT temp_table_1.name
FROM original_table_1 temp_table_1
LEFT JOIN original_table_2 temp_table_2 ON temp_table_2.name = temp_table_1.name
WHERE temp_table_2.name IS NULL

এবং আমি এমআরএসএল-তে টেবিলের নামগুলির মধ্যে কমাগুলির প্রয়োজন থেকে ফ্রেমে সিনট্যাক্সটি দেখেছি তবে স্কেললাইটে মনে হচ্ছে এটি স্থানটিকে পছন্দ করবে।

নীচের লাইনটি যখন আপনি খারাপ পরিবর্তনশীল নাম ব্যবহার করেন এটি প্রশ্ন ফেলে leaves আমার পরিবর্তনগুলি আরও বোধ করা উচিত। এবং কারও কাছে ব্যাখ্যা করা উচিত যে আমাদের কেন কমা বা কমা নেই।


0

আপনি যদি নির্দিষ্ট ব্যবহারকারী নির্বাচন করতে চান

SELECT tent_nmr FROM Statio_Tentative_Mstr
WHERE tent_npk = '90009'
AND
tent_nmr NOT IN (SELECT permintaan_tent FROM Statio_Permintaan_Mstr)

tent_npkএকটি ব্যবহারকারী একটি প্রাথমিক চাবিকাঠি

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