সমাধান সম্পর্কে সতর্কতা:
অনেকগুলি বিদ্যমান সমাধানগুলি যদি ভুলগুলি না দেয় তবে ভুল ফলাফল দিতে হবে
আপনি যদি কেবলমাত্র টেবিল তৈরির ব্যক্তি হন তবে এটি প্রাসঙ্গিক নাও হতে পারে তবে বেশ কয়েকটি সমাধানের ক্ষেত্রে প্রশ্নযুক্ত কোড থেকে বিভিন্ন সংখ্যক আউটপুট সারি দেওয়া হবে, যখন কোনও টেবিলের কোনওটিতে অনন্য সারি থাকবে না।
সমস্যা সংক্রান্ত বিবৃতি সম্পর্কে সতর্কতা:
একাধিক কলমের সাথে অস্তিত্ব নেই, আপনি যা চান তা যত্ন সহকারে ভাবুন TH
আমি যখন দুটি কলাম সহ একটি দেখি, তখন আমি এটি দুটি জিনিস বোঝার জন্য কল্পনা করতে পারি:
- কলাম ক এবং ক কলামের মান অন্য টেবিলটিতে স্বাধীনভাবে উপস্থিত হয়
- কলাম ক এবং ক কলামের মান একই সারিতে অন্য সারণীতে উপস্থিত হবে
পরিস্থিতি 1 মোটামুটি তুচ্ছ, কেবল দুটি আইএন স্টেটমেন্ট ব্যবহার করুন।
সর্বাধিক বিদ্যমান উত্তরের সাথে সামঞ্জস্য রেখে, আমি এখানে দৃশ্যের 2 (এবং একটি সংক্ষিপ্ত রায়) এর জন্য উল্লিখিত এবং অতিরিক্ত পদ্ধতির একটি সংক্ষিপ্তসার সরবরাহ করেছি:
উপস্থিত (নিরাপদ, এসকিউএল সার্ভারের জন্য প্রস্তাবিত)
@ মির্দেনি দ্বারা সরবরাহ করা হিসাবে, আপনি যা খুঁজছেন ঠিক সেই রকমই উপস্থিতিগুলি মনে হচ্ছে, তার উদাহরণ এখানে:
SELECT * FROM T1
WHERE EXISTS
(SELECT * FROM T2
WHERE T1.a=T2.a and T1.b=T2.b)
বাম সেমি যোগ দিন (নিরাপদ, এটি সমর্থন করে এমন উপভাষাগুলির জন্য প্রস্তাবিত)
এটি যোগদানের জন্য একটি খুব সংক্ষিপ্ত উপায়, তবে দুর্ভাগ্যক্রমে এসকিউএল সার্ভার সহ বেশিরভাগ এসকিউএল উপভাষাগুলি বর্তমানে এটি সমর্থন করে না।
SELECT * FROM T1
LEFT SEMI JOIN T2 ON T1.a=T2.a and T1.b=T2.b
একাধিক IN বিবৃতি (নিরাপদ, তবে কোড ডুপ্লিকেশন থেকে সাবধান থাকুন)
@ ক্যাটাক্লাইজম দ্বারা উল্লিখিত হিসাবে দুটি আইএন বিবৃতি ব্যবহার করে কৌশলটিও করতে পারে, সম্ভবত এটি অন্যান্য সমাধানগুলিকেও ছাড়িয়ে যাবে। যাইহোক, আপনার যা খুব যত্নবান হওয়া উচিত তা হ'ল কোড ডুপ্লিকেশন। আপনি যদি কখনও কোনও আলাদা টেবিল থেকে নির্বাচন করতে চান বা বিবৃতি পরিবর্তন করতে চান তবে এটি আপনার যুক্তিতে অসঙ্গতি তৈরি করা বর্ধিত ঝুঁকি।
বেসিক সমাধান
SELECT * from T1
WHERE a IN (SELECT a FROM T2 WHERE something)
AND b IN (SELECT b FROM T2 WHERE something)
কোড সদৃশ ছাড়াই সমাধান (আমি বিশ্বাস করি এটি নিয়মিত এসকিউএল সার্ভারের অনুসন্ধানগুলিতে কাজ করে না)
WITH mytmp AS (SELECT a, b FROM T2 WHERE something);
SELECT * from T1
WHERE a IN (SELECT a FROM mytmp)
AND b IN (SELECT b FROM mytmp)
অন্তর্ভুক্ত যোগদান (প্রযুক্তিগতভাবে এটি নিরাপদ করা যায়, তবে প্রায়শই এটি করা হয় না)
আমি কেন ফিল্টার হিসাবে অভ্যন্তরীণ যোগদানের পরামর্শ দেওয়ার পরামর্শ দিচ্ছি না, কারণ অনুশীলনে লোকেরা প্রায়শই ডান টেবিলের অনুলিপিগুলি বাম টেবিলে নকল করতে দেয়। এবং তারপরে বিষয়টিকে আরও খারাপ করার জন্য, তারা কখনও কখনও শেষ ফলাফলটিকে আলাদা করে দেয় যদিও বাম টেবিলটি আসলে অনন্য হওয়ার প্রয়োজন না (বা আপনার নির্বাচিত কলামগুলিতে অনন্য নয়)। ফিউটারমোর এটি আপনাকে বাস্তবে একটি কলাম নির্বাচন করার সুযোগ দেয় যা বাম সারণীতে বিদ্যমান নেই।
SELECT T1.* FROM T1
INNER JOIN
(SELECT DISTINCT a, b FROM T2) AS T2sub
ON T1.a=T2sub.a AND T1.b=T2sub.b
সর্বাধিক সাধারণ ভুল:
- নিরাপদে সাবকিউরি না করে সরাসরি টি 2 এ যোগদান করা। সদৃশ হওয়ার ঝুঁকিতে ফলাফল)
- নির্বাচন করুন * (টি 2 থেকে কলাম পেতে গ্যারান্টিযুক্ত)
- সি নির্বাচন করুন (গ্যারান্টি দেয় না যে আপনার কলামটি আসে এবং সর্বদা টি 1 থেকে আসে)
- কোনও ভুল জায়গায় DISTINCT বা DISTINCT নেই
SEPARATOR সহ কলমের সংযোগ (খুব নিরাপদ নয়, ভয়ঙ্কর পারফরম্যান্স)
কার্যকরী সমস্যাটি হ'ল আপনি যদি কোনও বিভাজনকারী ব্যবহার করেন যা কোনও কলামে ঘটতে পারে তবে ফলাফলটি 100% সঠিক কিনা তা নিশ্চিত করা জটিল। প্রযুক্তিগত সমস্যাটি হ'ল এই পদ্ধতিটি প্রায়শই ধরণের রূপান্তরগুলি অন্তর্ভুক্ত করে এবং সূচকগুলি সম্পূর্ণ উপেক্ষা করে, ফলস্বরূপ সম্ভবত ভয়াবহ কর্মক্ষমতা হয়। এই সমস্যাগুলি সত্ত্বেও, আমাকে স্বীকার করতে হবে যে আমি মাঝে মাঝে এটি ছোট ডেটাসেটগুলিতে অ্যাড-হক প্রশ্নগুলির জন্য ব্যবহার করি।
SELECT * FROM T1
WHERE CONCAT(a,"_",b) IN
(SELECT CONCAT(a,"_",b) FROM T2)
মনে রাখবেন যে আপনার কলামগুলি যদি সংখ্যাসূচক হয় তবে কিছু এসকিউএল ডায়ালাইকের জন্য আপনাকে সেগুলি প্রথমে স্ট্রিংয়ে কাস্ট করতে হবে। আমি বিশ্বাস করি এসকিউএল সার্ভার এটি স্বয়ংক্রিয়ভাবে করবে।
জিনিসগুলিকে মোড়ানোর জন্য: যথারীতি এসকিউএল-তে এটি করার অনেকগুলি উপায় রয়েছে, নিরাপদ পছন্দগুলি ব্যবহার করা অবাক হয়ে যাবে এবং দীর্ঘ সময় আপনার সময় এবং মাথাব্যথা সাশ্রয় করবে।