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


323

আমি একটি ডাটাবেস অ্যাপ্লিকেশনটিতে কিছু রক্ষণাবেক্ষণের কাজ করছি এবং আমি এটি আবিষ্কার করেছি যে, আনন্দের আনন্দ, যদিও এক টেবিলের মানগুলি বিদেশী কীগুলির স্টাইলে ব্যবহৃত হচ্ছে, টেবিলগুলিতে কোনও বিদেশী কী বাধা নেই।

আমি এই কলামগুলিতে এফকে বাধা যুক্ত করার চেষ্টা করছি, তবে আমি এটি খুঁজে পাচ্ছি, কারণ পূর্ববর্তী ত্রুটিগুলির মধ্যে ইতিমধ্যে টেবিলগুলিতে পুরো ডেটা বাজে তথ্য রয়েছে যা নির্লজ্জভাবে সংশোধন করা হয়েছে, আমাকে সারিগুলি খুঁজে বের করতে হবে যা না অন্য টেবিলের সাথে মেলে এবং তারপরে সেগুলি মুছুন।

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

অন্য কেউ কীভাবে আমাকে এমন কোনও কোয়েরি তৈরি করতে পারেন যা অন্য সারণীতে কোনও মিল নেই এবং এটি কী করছে, যা সমস্ত সারি প্রদান করে, কীভাবে তৈরি করা যায়, যাতে আমি এই মেসের প্রতিটি টেবিলের জন্য এসও-তে ছুটে আসার পরিবর্তে নিজেই এই প্রশ্নগুলি তৈরি করতে পারি has এফকে বাধা নেই?

উত্তর:


612

এখানে একটি সহজ প্রশ্ন:

SELECT t1.ID
FROM Table1 t1
    LEFT JOIN Table2 t2 ON t1.ID = t2.ID
WHERE t2.ID IS NULL

মূল বিষয়গুলি হ'ল:

  1. LEFT JOINব্যবহৃত হয়; Table1এটি কোনও মিলের সারি রয়েছে কিনা তা বিবেচনা না করেই সমস্ত সারিগুলি থেকে সমস্ত ফিরিয়ে আনে Table2

  2. দ্য WHERE t2.ID IS NULLদফা; এটি কেবলমাত্র সেই সারিগুলিতে ফিরে আসা ফলাফলকে সীমাবদ্ধ করবে যেখানে থেকে ফিরে আসা আইডিটি Table2শূন্য - অন্য কথায় that নির্দিষ্ট আইডির কোনও রেকর্ড নেই । যে সমস্ত আইডি মেলেনি সেখান থেকে সমস্ত রেকর্ডের জন্য NULL হিসাবে ফিরে আসবে ।Table2Table1Table2.IDTable1Table2


4
কোনও আইডি NULL হলে ব্যর্থ হয়
মাইকেল

168
@ মিশেল - NULLআপনার আইডিটি যদি আপনার স্কিমাতে বৈধ হয় তবে আপনার বড় সমস্যা হতে পারে, আপনি কি সম্মতি করবেন না? :)
রিনোগো

1
টেবিল 1 এর আরও টেবিল 2 থাকলেও এটি কি কাজ করবে? যদি টেবিল 1 এর 100 টি রেকর্ড রয়েছে এবং টেবিল 2 এর 200 টি রেকর্ড রয়েছে (100 টি ম্যাচ / জয়েন এবং 100 যা মেলে না / যোগ দেয় না) আমরা কি সমস্ত 200 রেকর্ড ফিরে পেয়েছি?
হুয়ান ভেলিজ

1
আমি প্রায়শই বাম অংশটি সাব-কোয়েরি / ইনলাইন ভিউ হিসাবে মোড়তে চাই যাতে নিশ্চিত হয় যে যেখানে যেখানে বিধি এবং বাম জোনের মধ্যে কোনও ইন্টারপ্লে নেই।
অ্যান্ড্রু ওল্ফ

1
@ জাস মূল পয়েন্ট 1 টি উত্তর, সমস্ত সারণি প্রথম সারণী থেকে, এমনকি যারা T1.ID = t2.ID এর সাথে মেলে না তার বাম সংযোগের শর্ত। আপনি যদি প্রথম লাইনটি SELECT t1.ID, t2.IDWHERE রেখায় পরিবর্তন করেন এবং সরিয়ে ফেলেন তবে আপনি কীভাবে এটি কাজ করে তা ভাল ধারণা পাবেন।
পিটার ল্যাবো

97

আমি EXISTSএক্সপ্রেশনটি ব্যবহার করব যেহেতু এটি আরও শক্তিশালী, আপনি যুক্ত হতে পারবেন LEFT JOINএমন টেবিলে যা কিছু নিতে হবে সে ক্ষেত্রে আপনি আরও সুনির্দিষ্টভাবে আপনি যে সারিগুলিতে যোগদান করতে চান তা চয়ন করতে পারেন। এর দক্ষতা LEFT JOINনাল পরীক্ষার ক্ষেত্রে সম্ভবত একই রকম ।

SELECT t1.ID
FROM Table1 t1
WHERE NOT EXISTS (SELECT t2.ID FROM Table2 t2 WHERE t1.ID = t2.ID)

এই কার্যকর কিছুটি ক্যুরি অপটিমাইজার দ্বারা সেরা প্রয়োগের জন্য সহজেই পরিচালনা করা হয়।
অ্যান্ড্রু ওল্ফ

2
হ্যাঁ, এর প্রধান সুবিধা EXISTSহ'ল এর পরিবর্তনশীলতা।
ndন্দ্রজ বোজেক

1
সরল, মার্জিত এবং এটি আমার সমস্যার সমাধান! সুন্দর!
মাইকমাইটি

2
প্রকৃতপক্ষে আমার কাছে থাকা একটি ক্যোয়ারীর গতি 7 সেকেন্ড থেকে 200 মিলিয়ন হয়ে গেছে ... (তুলনায় WHERE t2.id IS NULL) আপনাকে ধন্যবাদ।
মতি কোরেটস

4
@MotiKorets আপনি গতি :) বৃদ্ধি মানে
Ondrej Bozek

14
SELECT id FROM table1 WHERE foreign_key_id_column NOT IN (SELECT id FROM table2)

সারণী 1 এর একটি কলাম রয়েছে যা আপনি বৈদেশিক কী সীমাবদ্ধতার সাথে যুক্ত করতে চান, তবে মানগুলি foreign_key_id_columnসমস্ত idটেবিল 2 এর সাথে মেলে না ।

  1. প্রাথমিক নির্বাচন idটেবিল 1 থেকে গুলি তালিকাভুক্ত করে । এগুলি সরাতে হবে যা আমরা মুছতে চাই।
  2. NOT INমধ্যে দফা যেখানে বিবৃতি শুধুমাত্র সারিতে ক্যোয়ারী যেখানে মান সীমিত foreign_key_id_columnটেবিলের তালিকায় না থাকে 2id সে।
  3. প্রথম SELECTবন্ধনীতে বিবৃতিটি idটেবিল 2-এ থাকা সমস্ত গুলিগুলির একটি তালিকা পাবে ।

@ zb226: আপনার লিঙ্কটি INআক্ষরিক মানগুলির একটি তালিকা সহ ধারাটিতে সীমাবদ্ধতার সাথে সম্পর্কযুক্ত । এটি INএকটি সাব-কোয়েরির ফলাফল সহ একটি ধারা ব্যবহার করার জন্য প্রযোজ্য নয় । এই প্রশ্নের গৃহীত উত্তর আসলে একটি সাব-কোয়েরি ব্যবহার করে সমস্যার সমাধান করে। (আক্ষরিক মানগুলির একটি বৃহত তালিকা সমস্যাযুক্ত কারণ এটি একটি বিশাল এসকিউএল এক্সপ্রেশন তৈরি করে A একটি সাব-কোয়েরি সূক্ষ্মভাবে কাজ করে কারণ, ফলাফলের তালিকাটি বৃহত্তর হলেও এসকিউএল এক্সপ্রেশনটি নিজেই ছোট))
কান্নান গাউন্ডান

পছন্দ করুন ত্রুটিযুক্ত মন্তব্য প্রত্যাহার।
zb226

8

T2আপনি যে সারণিতে সীমাবদ্ধতা যুক্ত করছেন তা কোথায় :

SELECT *
FROM T2
WHERE constrained_field NOT
IN (
    SELECT DISTINCT t.constrained_field
    FROM T2 
    INNER JOIN T1 t
    USING ( constrained_field )
)

এবং ফলাফল মুছুন।


4

আমাদের নীচের 2 টি টেবিল (বেতন এবং কর্মচারী) রাখুন এখানে চিত্র বর্ণনা লিখুন

এখন আমি সেই রেকর্ডগুলি কর্মচারীর টেবিল থেকে চাই যা বেতনের মধ্যে নেই। আমরা এটি 3 উপায়ে করতে পারি:

  1. অভ্যন্তরীণ যোগদান ব্যবহার করে
select * from employee
where id not in(select e.id from employee e inner join salary s on e.id=s.id)

এখানে চিত্র বর্ণনা লিখুন

  1. বাম বাহ্যিক জোড় ব্যবহার
select * from employee e 
left outer join salary s on e.id=s.id  where s.id is null

এখানে চিত্র বর্ণনা লিখুন

  1. সম্পূর্ণ যোগদান ব্যবহার
select * from employee e
full outer join salary s on e.id=s.id where e.id not in(select id from salary)

এখানে চিত্র বর্ণনা লিখুন


2

অনুরূপ প্রশ্ন থেকে এখানে মাইএসকিউএল অভ্যন্তরীণ অন্যান্য সারণীতে রেকর্ড উপস্থিত না থাকায় ক্যোয়ারিতে যোগদান করুন আমি এটি কাজ করতে পেরেছি

SELECT * FROM bigtable 
LEFT JOIN smalltable ON bigtable.id = smalltable.id 
WHERE smalltable.id IS NULL

smalltableযেখানে আপনার রেকর্ড নেই, bigtableসেখানে আপনার সমস্ত রেকর্ড রয়েছে। কোয়েরিতে সমস্ত রেকর্ডের তালিকা রয়েছে যা বিদ্যমান নেই smalltableতবে বিদ্যমান রয়েছে bigtable। আপনি idঅন্য যে কোনও মিলের মানদণ্ড দ্বারা প্রতিস্থাপন করতে পারেন ।


0

আপনি এর জন্য মনোনীত করা যায়নি দেখেছে নিচের চিত্রের:

CREATE VIEW AuthorizedUserProjectView AS select t1.username as username, t1.email as useremail, p.id as projectid, 
(select m.role from userproject m where m.projectid = p.id and m.userid = t1.id) as role 
FROM authorizeduser as t1, project as p

এবং তারপরে বাছাই বা আপডেট করার জন্য ভিউতে কাজ করুন:

select * from AuthorizedUserProjectView where projectid = 49

যা নীচের ছবিতে যেমন ফলাফল মিলেছে অর্থাত না খাঁজ কাটা কলামের সাথে পূরণ করা হয়েছে in

[Result of select on the view][1]

0

আমি জানি না কোনটি অপটিমাইজড হয়েছে (@ আডাএডেভের তুলনায়) তবে আমি যখন ব্যবহার করি তখন এটি দ্রুত হয় বলে মনে হয় (আমার পক্ষে কমপক্ষে)

SELECT id  FROM  table_1 EXCEPT SELECT DISTINCT (table1_id) table1_id FROM table_2

আপনি যদি অন্য কোনও নির্দিষ্ট বৈশিষ্ট্য পেতে চান তবে আপনি ব্যবহার করতে পারেন:

SELECT COUNT(*) FROM table_1 where id in (SELECT id  FROM  table_1 EXCEPT SELECT DISTINCT (table1_id) table1_id FROM table_2);


-2

আপনি এরকম কিছু করতে পারেন

   SELECT IFNULL(`price`.`fPrice`,100) as fPrice,product.ProductId,ProductName 
          FROM `products` left join `price` ON 
          price.ProductId=product.ProductId AND (GeoFancingId=1 OR GeoFancingId 
          IS NULL) WHERE Status="Active" AND Delete="No"

-6

উভয় টেবিলে কোনও মিল নেই এমন সারিগুলি কীভাবে নির্বাচন করবেন?

    [ডিবিও] থেকে * নির্বাচন করুন [[এমপ্পডেটেলস] ই
     ডান যোগদান করুন [কর্মচারী]। [লিঙ্গ] d তে e.Gid = d.Gid
    যেখানে e.Gid নাল

    মিলন 
    [ডিবিও] থেকে * নির্বাচন করুন [[এমপ্পডেটেলস] ই
     বামে যোগ দিন [কর্মচারী]। [লিঙ্গ] d তে e.Gid = d.Gid
    যেখানে ডি.জিড নাল

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