মাইএসকিএল: অন্য কোনও টেবিল থেকে সারিগুলি নির্বাচন করুন


118

এক টেবিলের সমস্ত সারি যে অন্যটিতে উপস্থিত না হয় তা কীভাবে নির্বাচন করবেন?

1 নং টেবিল:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Tia       | Carrera  | 1975-09-18 |
| Nikki     | Taylor   | 1972-03-04 |
| Yamila    | Diaz     | 1972-03-04 |
+-----------+----------+------------+

টেবিল ২:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Tia       | Carrera  | 1975-09-18 |
| Nikki     | Taylor   | 1972-03-04 |
+-----------+----------+------------+

টেবিল 1 এ সারিগুলির জন্য আউটপুট উদাহরণ যা টেবিল 2 এ নেই:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Yamila    | Diaz     | 1972-03-04 |
+-----------+----------+------------+

এই জাতীয় কিছু কাজ করা উচিত:

SELECT * FROM Table1 WHERE * NOT IN (SELECT * FROM Table2)

উত্তর:


96

আপনি যদি অন্য মন্তব্যে উল্লিখিত হিসাবে আপনার কাছে 300 টি কলাম থাকে এবং আপনি সমস্ত কলামগুলিতে তুলনা করতে চান (কলামগুলি একই নাম হিসাবে ধরে নেওয়া হচ্ছে), আপনি NATURAL LEFT JOINদুটি টেবিলের মধ্যে সমস্ত মিলিয়ে কলামের নামগুলিতে স্পষ্টভাবে যোগদান করতে একটি ব্যবহার করতে পারেন যাতে আপনি ক্লান্তিকরভাবে সমস্ত যোগদানের শর্ত ম্যানুয়ালি টাইপ করতে হবে না:

SELECT            a.*
FROM              tbl_1 a
NATURAL LEFT JOIN tbl_2 b
WHERE             b.FirstName IS NULL

নোট করুন যে এটি কেবল তখনই প্রত্যাশিত হিসাবে কাজ করে যখন কলামগুলির কোনওটিরই নুল মান থাকে না। মাইএসকিউএল নূলে! = NULL সুতরাং দ্বিতীয় সারির নকল সারি থাকা সত্ত্বেও প্রতিটি সারিতে নুল মান রয়েছে এমনটি ফিরে আসবে।
কাইল কোচিস

84
আপনার যদি 300 কলাম রয়েছে, আপনার আপনার ডাটাবেসটিকে নতুন করে ডিজাইন করতে হবে।
ইহরব আল আসিমি

আরে এটা আমার জন্যও কাজ করে, ধন্যবাদ! তবে উপরে বর্ণিত সারিগুলি> 300 এর মতো হলে কী সমস্যা হবে?
thekucays

আমি এখনও btw ক্যোয়ারী সম্পর্কে বিভ্রান্ত হয়েছি ... আমি যদি "বি। ফার্স্টনাম নাল" যেখানে "যেখানে বি। পার্থক্য কি? আমি এটি জিজ্ঞাসা করার জন্য দুঃখিত, আমি এখনও
বর্গক্ষেত্রে

184

আপনার কলাম নামের উপর ভিত্তি করে সাবলেট করতে হবে, না *

উদাহরণস্বরূপ, যদি আপনার idউভয় টেবিলের জন্য একটি ক্ষেত্র সাধারণ থাকে তবে আপনি এটি করতে পারেন:

SELECT * FROM Table1 WHERE id NOT IN (SELECT id FROM Table2)

আরও উদাহরণের জন্য মাইএসকিউএল সাবকিউয়ের সিনট্যাক্স দেখুন।


1
স্পষ্টতার জন্য ধন্যবাদ! তবে আমার কোনও ক্ষেত্রের সারি বাছাইয়ের ভিত্তি

যদি তুলনা করার জন্য কেবল কয়েকটি কলাম থাকে তবে আপনি @ স্টিভের উদাহরণ অনুসারে একটি যোগদান করতে পারেন। আপনি যদি সত্যিই অনেকগুলি কলাম সহ দুটি টেবিলের মধ্যে ডেটার একটি সাধারণ তুলনা চাইছেন, আপনি সম্ভবত একটি মাইএসকিউএল ডিফ সরঞ্জামের সন্ধান করতে চান ।
স্টেনি

2
মনে রাখবেন যে আপনি টেবিল 2 এ যে কলামটি সন্ধান করছেন তাতে যদি শূন্য থাকে তবে এটি সর্বদা একটি খালি সেট ফিরে আসবে। আপনি যদি এটি প্রাথমিক কী এর উপর ভিত্তি করে করছেন তবে কোনও সমস্যা নয়, তবে অন্যান্য প্রসঙ্গে এই কোয়েরিটি ব্যবহার করার চেষ্টা করছেন এমন লোকদের সাথে প্রাসঙ্গিক।
মার্ক আমেরিকা

4
তবে আমরা যদি বড় ডেটা নিয়ে কথা বলি তবে কী হবে? এবং টেবিল 2 এ 100M সারি রয়েছে, উদাহরণস্বরূপ?
ফ্রুপ

স্মার্ট এবং চতুর উত্তর।
সাথীদের

44
SELECT *
FROM Table1 AS a
WHERE NOT EXISTS (
  SELECT *
  FROM Table2 AS b 
  WHERE a.FirstName=b.FirstName AND a.LastName=b.Last_Name
)

EXISTS তোমাকে সাহায্য করব...


2
ভাল উত্তর, বড় ডেটা সেট জন্য অর্থনৈতিক, ধন্যবাদ।
নির্মাতা

স্ট্রং। বড় ডেটাসেটের সেরা উত্তর
ইয়ান চাদউইক

35

একটি স্ট্যান্ডার্ড বাম জয়েন্ট সমস্যা সমাধান করতে পারে এবং যদি যোগদানের ক্ষেত্রগুলি সূচকযুক্ত হয় তবে
তা আরও দ্রুত হওয়া উচিত

SELECT *
FROM Table1 as t1 LEFT JOIN Table2 as t2 
ON t1.FirstName = t2.FirstName AND t1.LastName=t2.LastName
WHERE t2.BirthDate Is Null

ঠিক আছে, আমার ধারণা এটি অবশ্যই হওয়া উচিত, বিটিডব্লিউ এর WHERE t2.Birthdate Is Nullপরিবর্তে কেন AND t1.Birthdate = t2.Birthdate?

কারণ আপনি যদি এটি যোগ করেন, তবে প্রতিটি সারিটি ফিরে আসবে, আপনি বলেছেন যে আউটপুটে কেবল সারিটি দ্বিতীয় সারণীতে প্রদর্শিত হবে না
স্টিভ

1
এটি একটি ভয়ঙ্কর উত্তর, কারণ এটির সমস্ত সারি ফেরত দেওয়ার প্রয়োজন হয় না Table2!
dotancohen

আমি সম্মত, দুর্দান্ত উত্তর। আমার কাছে 4 টি টেবিলের মধ্যে একটি ম্যান-বহু টেবিল রয়েছে, এবং অন্তঃস্থ জোড়গুলিতে AND লাগানো অবশ্যই স্পষ্টতই আরও অর্থনৈতিক হতে চলেছে।
ডা।


4

এই সহজ জিজ্ঞাসা চেষ্টা করুন। এটি পুরোপুরি কাজ করে।

select * from Table1 where (FirstName,LastName,BirthDate) not in (select * from Table2);


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