এসকিউএল - যেখানে ভিএস রয়েছে


202

আমার কাছে নিম্নলিখিত দুটি টেবিল রয়েছে:

1. Lecturers (LectID, Fname, Lname, degree).
2. Lecturers_Specialization (LectID, Expertise).

আমি সর্বাধিক বিশেষায়নের সাথে প্রভাষককে সন্ধান করতে চাই। আমি যখন এটি চেষ্টা করি তখন এটি কার্যকর হয় না:

SELECT
  L.LectID, 
  Fname, 
  Lname 
FROM Lecturers L, 
     Lecturers_Specialization S
WHERE L.LectID = S.LectID
AND COUNT(S.Expertise) >= ALL (SELECT
  COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID);

তবে আমি যখন এটি চেষ্টা করি তখন এটি কাজ করে:

SELECT
  L.LectID,
  Fname,
  Lname 
FROM Lecturers L,
     Lecturers_Specialization S
WHERE L.LectID = S.LectID
GROUP BY L.LectID,
         Fname,
         Lname 
HAVING COUNT(S.Expertise) >= ALL (SELECT
  COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID); 

কারণ কি? ধন্যবাদ।


2
আপনি যে এসকিউএল ব্যবহার করছেন তা কোন সংস্করণ (মাইএসকিউএল, এমএস এসকিউএল, পোস্টগ্র্রেএসকিউএল, ওরাকল ইত্যাদি) পরিষ্কার করতে পারেন? এছাড়াও, যখন আপনি "কাজ করেন না" বলছেন, আপনার অর্থ কি ফলাফল আপনি প্রত্যাশা মতো করেন নি, বা একটি সংকলন / পার্স ত্রুটি রয়েছে?
jklemmack

2
আপনি ম্যাক্সের পরিবর্তে সমস্ত ব্যবহার করবেন কেন ?. কোন সুবিধা আছে?
স্ক্যান

উত্তর:


351

WHEREধারা পৃথক সারিগুলিতে একটি শর্ত প্রবর্তন করে ; HAVINGধারাটি সমষ্টিগুলিতে একটি শর্ত প্রবর্তন করে , অর্থাত্ নির্বাচনের ফলাফল যেখানে একক ফলাফল যেমন গণনা, গড়, নূন্যতম, সর্বোচ্চ, বা যোগফল একাধিক সারি থেকে উত্পন্ন হয় produced আপনার ক্যোয়ারী দ্বিতীয় ধরণের শর্তের জন্য কল করে (অর্থাত্ একটি সংস্থার শর্ত) সুতরাং HAVINGসঠিকভাবে কাজ করে।

থাম্বের নিয়ম হিসাবে, WHEREআগে GROUP BYএবং HAVINGপরে ব্যবহার করুন GROUP BY। এটি বরং একটি প্রাথমিক নিয়ম, তবে এটি 90% এরও বেশি ক্ষেত্রে কার্যকর।

আপনি এটির সময়ে, আপনি যোগদানের এএনএসআই সংস্করণ ব্যবহার করে আপনার ক্যোয়ারীটি আবার লিখতে চাইতে পারেন:

SELECT  L.LectID, Fname, Lname
FROM Lecturers L
JOIN Lecturers_Specialization S ON L.LectID=S.LectID
GROUP BY L.LectID, Fname, Lname
HAVING COUNT(S.Expertise)>=ALL
(SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID)

এটি থিটা জয়েন শর্তWHERE হিসাবে ব্যবহার করা হয়েছিল তা দূর করবে ।


39

HAVINGসমষ্টিগুলিতে পরিচালনা করে। যেহেতু COUNTএকটি সামগ্রিক ফাংশন, আপনি এটি একটি WHEREধারাতে ব্যবহার করতে পারবেন না ।

এখানে সামগ্রিক ফাংশনগুলি সম্পর্কে এমএসডিএন থেকে কিছু পড়া।


30

প্রথমে আমাদের ক্লজগুলির ফাঁসির আদেশটি জানতে হবে (যেমন থেকে> যেখানে> গ্রুপ> পরিচালনা> বিচ্ছিন্ন> নির্বাচন করুন> অর্ডার)। যেহেতু কোথায় ধারা আগে মৃত্যুদন্ড কার্যকর করা একদল ধারা রেকর্ড প্রয়োগের দ্বারা ফিল্টার করা যাবে না কোথায় করার জন্য একটি গ্রুপ দ্বারা প্রয়োগ রেকর্ড।

"HAVING WHERE ধারা হিসাবে সমান তবে গ্রুপযুক্ত রেকর্ডে প্রয়োগ করা হয়"।

প্রথমে WHERE ধারাটি শর্তের উপর ভিত্তি করে রেকর্ডগুলি নিয়ে আসে তারপরে গ্রুপ দ্বারা গ্রুপ তাদের অনুসারে গ্রুপ তৈরি করে এবং তারপরে HAVING ধারাটি শর্তের ভিত্তিতে গ্রুপ রেকর্ডগুলি নিয়ে আসে।


এই ক্রমের ক্রমটি কি সর্বদা ব্যবহৃত হয়? যদি ক্যোয়ারী অপ্টিমাইজার অর্ডার পরিবর্তন করে?
এমএসআইএস

1
@ এমএমআইএস এমনকি ক্যোরি অপ্টিমাইজারের অর্ডার পরিবর্তন করলেও ফলাফলটি একই হওয়া উচিত যেমন এই আদেশটি অনুসরণ করা হয়েছিল। এটি একটি যৌক্তিক ক্রম।
স্টিফেন

18
  1. যেখানে ক্লজটি নির্বাচন, INSERT এবং আপডেট আপডেটের সাথে ব্যবহার করা যেতে পারে, সেখানে কেবল নির্বাচনী বিবৃতি দিয়েই ব্যবহার করা যেতে পারে।

  2. একত্রিতকরণের আগে যেখানে সারিগুলি ফিল্টার করে (গ্রুপ বাই), সেখানে সমষ্টি সম্পাদনের পরে ফিল্টার গ্রুপগুলি রয়েছে A

  3. একত্রিত ফাংশনটি হ'ল ক্লজে ব্যবহার করা যাবে না যতক্ষণ না এটি HAVING ধারাটিতে অন্তর্ভুক্ত সাবকোয়ারীতে থাকে, তবে সমষ্টিগত ক্রিয়াগুলি HAVING ধারাটিতে ব্যবহার করা যেতে পারে।

উৎস


11

একটি প্রশ্নের মধ্যে উভয়ের উদাহরণ দেখেনি Did সুতরাং এই উদাহরণ সাহায্য করতে পারে।

  /**
INTERNATIONAL_ORDERS - table of orders by company by location by day
companyId, country, city, total, date
**/

SELECT country, city, sum(total) totalCityOrders 
FROM INTERNATIONAL_ORDERS with (nolock)
WHERE companyId = 884501253109
GROUP BY country, city
HAVING country = 'MX'
ORDER BY sum(total) DESC

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


এটি রূপান্তর করতে পারার মতো এটি উদাহরণ হিসাবে খুব ভাল নয়: company কোথায় কোম্পানির আইডি = 884501253109 গ্রুপের দেশ, শহর রয়েছে দেশ = 'এমএক্স' `তে:` কোথায় কোম্পানীর আইডি = 884501253109, দেশ = 'এমএক্স' গ্রুপের শহর
E

[Suggested দেশ] ফিল্টারিংটি কেবল যেখানে আপনি প্রস্তাব করেছেন সেটিতে সরিয়ে ফেললে, নির্বাচনটি [নির্বাচন করুন] থেকে অনুসন্ধানটি ত্রুটিযুক্ত হবে, কারণ [দেশ] আর গ্রুপ বাই একীকরণের অন্তর্ভুক্ত নয়, সুতরাং এটি নির্বাচন করা যায় না।
Nhan

অপ্টিমাইজেশনের বিষয়ে আপনার বক্তব্যটি [দেশকে] যেখানে নিয়ে যাওয়ার দিকে নেওয়া হয়েছে কারণ পরবর্তীতে গ্রুপ দ্বারা সেট করা একটি ছোট ডেটা হবে। অবশ্যই এটি সম্ভাব্য ব্যবহারগুলি বর্ণনা করার জন্য কেবল একটি উদাহরণ। আমরা HAVING যোগফল (মোট)> 1000 এ পরিবর্তন করতে পারি এবং WHEE এবং HAVING অন্তর্ভুক্ত করার জন্য এটি একটি সম্পূর্ণ বৈধ কেস।
Nhan

9

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

উদাহরণ ক্যোয়ারী:

select empName, sum(Bonus) 
from employees 
order by empName 
having sum(Bonus) > 5000;

এটি রেজাল্টসেটটি একটি অস্থায়ী স্মৃতিতে সংরক্ষণ করবে, তারপরে ক্লজ থাকার ফলে এটি কাজ করবে। সুতরাং আমরা সহজেই এখানে সামগ্রিক ফাংশন ব্যবহার করতে পারি।


2
আমি মনে করি আমরা বিভাগ দ্বারা গ্রুপ ব্যতীত HAVING ধারাটি ব্যবহার করতে পারি না। বিভাজন দণ্ডের অবস্থান - নির্বাচন করুন -> ফর্ম থেকে -> যেখানে -> গ্রুপের মাধ্যমে -> চলছে -> অর্ডার দিন
মোরেজ

4

১. আমরা সামগ্রিক ফাংশনটি হ'ল ক্লজ সহ ব্যবহার করতে পারি যেখানে ক্লাসের অনুচ্ছেদে যেমন ন্যূনতম, সর্বাধিক, গড়।

২. যেখানে কোষটি রেকর্ড টিউপলকে টিপল দ্বারা সরিয়ে দেয়

আপনার যখন ডাটাগুলির গোষ্ঠী থাকে তখন বেশিরভাগই হ্যাভিং ব্যবহৃত হয় এবং যখন সারিগুলিতে ডেটা থাকে তখন WHERE ব্যবহৃত হয়।

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