মাইএসকিউএল: গ্রুপ ফাংশনটির অবৈধ ব্যবহার


104

আমি মাইএসকিউএল ব্যবহার করছি। এখানে আমার স্কিমা:

সরবরাহকারী ( সিড: পূর্ণসংখ্যা , নাম: স্ট্রিং, ঠিকানা স্ট্রিং)

অংশগুলি ( পিড : পূর্ণসংখ্যা , নাম: স্ট্রিং, রঙ: স্ট্রিং)

ক্যাটালগ ( সিড: পূর্ণসংখ্যা, পিড: পূর্ণসংখ্যা , ব্যয়: বাস্তব)

(প্রাথমিক কীগুলি সাহসী হয়)

আমি কমপক্ষে দুটি সরবরাহকারী দ্বারা তৈরি করা সমস্ত অংশগুলি নির্বাচন করতে একটি ক্যোয়ারী লেখার চেষ্টা করছি:

-- Find the pids of parts supplied by at least two different suppliers.
SELECT c1.pid                      -- select the pid
FROM Catalog AS c1                 -- from the Catalog table
WHERE c1.pid IN (                  -- where that pid is in the set:
    SELECT c2.pid                  -- of pids
    FROM Catalog AS c2             -- from catalog
    WHERE c2.pid = c1.pid AND COUNT(c2.sid) >= 2 -- where there are at least two corresponding sids
);

প্রথমে, আমি কি এটি সঠিক পথে চলছি?

দ্বিতীয়ত, আমি এই ত্রুটিটি পেয়েছি:

1111 - গ্রুপ ফাংশন অবৈধ ব্যবহার

আমি কি ভুল করছি?

উত্তর:


173

আপনার ব্যবহার করা দরকার HAVING, না WHERE

পার্থক্যটি হ'ল WHEREমাইএসকিউএল সারি করে এমন ক্লজ ফিল্টারগুলি নির্বাচন করে। তারপরে মাইএসকিউএল সারিগুলিকে এক সাথে বিভক্ত করে এবং আপনার COUNTফাংশনের জন্য সংখ্যাগুলিকে একত্রিত করে ।

HAVINGভালো হয় WHEREশুধুমাত্র এটি ঘটলে, পরেCOUNT মান নির্ণিত হয়েছে, হিসাবে আপনি আশা তাই এটি কাজ করব। আপনার সাবকিউরিটি আবার লিখুন:

(                  -- where that pid is in the set:
SELECT c2.pid                  -- of pids
FROM Catalog AS c2             -- from catalog
WHERE c2.pid = c1.pid
HAVING COUNT(c2.sid) >= 2)

24
এছাড়াও যদি গ্রুপ বাই ব্যবহার করা হয়, তবে গ্রুফের মাধ্যমে হওয়া উচিত
ভাইচাসলভ

1
এছাড়াও, গ্রুপ আপ হবার আগে হওয়া দরকার .... বান্দোলেরোর মন্তব্যটি পড়া উচিত ছিল: ডি
অ্যান্ড্রু

8

প্রথমত, আপনি যে ত্রুটিটি পেয়ে যাচ্ছেন তা হ'ল আপনি কোথায় COUNTফাংশনটি ব্যবহার করছেন - আপনি এই ধারাটিতে একটি সামগ্রিক (বা গোষ্ঠী) ফাংশন ব্যবহার করতে পারবেন না WHERE

দ্বিতীয়ত, সাবকিউরি ব্যবহার না করে কেবল টেবিলটিতে নিজের সাথে যোগ দিন:

SELECT a.pid 
FROM Catalog as a LEFT JOIN Catalog as b USING( pid )
WHERE a.sid != b.sid
GROUP BY a.pid

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


এটা কি আমার এমনকি যোগদানের দরকার নেই? (আমার আপডেট হওয়া উত্তরটি দেখুন, যেখানে আমি একটি সম্ভাব্য সমাধান সরবরাহ করেছি))
নিক হেইনার

@ রোসারচ, আমি মনে করি আপনি COUNT(DISTINCT sid)নিজের আপডেট হওয়া ক্যোয়ারিতে ব্যবহার করতে চাইবেন ।
মার্ক এলিয়ট

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