ORA-00979 প্রকাশের দ্বারা কোনও দল নয়


147

আমি নিম্নলিখিত কোয়েরির সাথে ORA-00979 পাচ্ছি:

SELECT cr.review_sk, cr.cs_sk, cr.full_name,
tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt",
cs.cs_id, cr.tracking_number
from review cr, cs, fact cf
where cr.cs_sk = cs.cs_sk
and UPPER(cs.cs_id) like '%' || UPPER(i_cs_id) || '%'
and row_delete_date_time is null
and cr.review_sk = cf.review_wk (+)
and cr.fact_type_code (+) = 183050
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number
ORDER BY cs.cs_id, cr.full_name;

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

উত্তর:


232

আপনি আপনার সমস্ত কলাম করা আবশ্যক SELECTমধ্যে GROUP BYঅথবা যার একটি একক মান ফলাফল কম্প্রেস (যেমন তাদের উপর ফাংশন ব্যবহার MIN, MAXবা SUM)।

কেন এটি ঘটে তা বোঝার একটি সহজ উদাহরণ: কল্পনা করুন আপনার কাছে এর মতো একটি ডাটাবেস রয়েছে:

FOO BAR
0   A
0   B

এবং আপনি চালান SELECT * FROM table GROUP BY foo। এর অর্থ এটি 0পূর্ণ করতে প্রথম কলামের ফলস্বরূপ ডাটাবেসকে অবশ্যই একটি একক সারি ফেরত দিতে হবে GROUP BYতবে এখন দুটি মান barবেছে নেওয়া হয়েছে। আপনি কোন ফলাফল আশা করবেন - Aবা B? বা চুক্তি লঙ্ঘন করে ডাটাবেস একাধিক সারিতে ফেরত দেওয়া উচিত GROUP BY?


7
না, আপনাকে সেগুলি আপনার
ধারাতে দেওয়ার প্রয়োজন নেই

3
আমি আদেশের মাধ্যমে দুটি কলামকে গ্রুপের মাধ্যমে যোগ করার চেষ্টা করেছি। কাজ করেছে। ধন্যবাদ!
থেরেসা

1
বা এটি অন্য উপায়ে রাখতে: আপনার যদি দুটি কলাম এবং প্রথমটি গ্রুপ হয় তবে এর অর্থ আপনার ফলস্বর সারিতে দ্বিতীয় কলাম থেকে বেশ কয়েকটি মান থাকবে। যেহেতু কেবলমাত্র একক ফলাফলের সারি রয়েছে তবে অনেকগুলি মান বেছে নিতে পারে, কোনটি ডিবি ফিরে আসবে? এতে প্রথম হোঁচট খাচ্ছে?
অ্যারন দিগুল্লা

6
@ অ্যারোনডিগুল্লা এটিই মাইএসকিউএল করে এবং পৃথিবীর শেষ হয়নি: পি
ক্রিস বেকার ২

1
আমি আংশিকভাবে একমত। তবে নিম্নলিখিত কেসটি ধরুন: এখানে 4 টি কলাম রয়েছে: A, B, C এবং D. এখন আমি একটি সংমিশ্রিত কী হিসাবে (A, B, C) সেট করি। তারপরে "এ, বি, সর্বাধিক (সি), ডি ... এ, বি দ্বারা গ্রুপ নির্বাচন করুন" অস্পষ্ট নয়, কারণ এ, বি এবং সি এর প্রতিটি সংমিশ্রণের জন্য ডি ইতিমধ্যে সংজ্ঞায়িত করা হয়েছে। তবুও ওরাকল তার কাজটি করতে অস্বীকার করেছে।
গা

17

গ্রুপ ফাংশন আর্গুমেন্ট না হয় এমন GROUP BYসমস্ত SELECTঅভিব্যক্তিটি ক্লজটিতে অন্তর্ভুক্ত করুন ।


9

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

তবে ওরাকলকে ঘিরে কাজ চলছে:

যখন নিম্নলিখিত লাইনটি কাজ করে না

SELECT unique_id_col, COUNT(1) AS cnt FROM yourTable GROUP BY col_A;

আপনার কলামটি স্কোপে রাখার জন্য আপনি ওরাকলকে নিম্নলিখিত 0 টির মতো কয়েকটি দিয়ে ঠকাতে পারেন, তবে এটির দ্বারা গোষ্ঠীভুক্ত নয় (ধরে নিবেন এটি সংখ্যক, অন্যথায় কনক্যাট ব্যবহার করুন)

SELECT MAX(unique_id_col) AS unique_id_col, COUNT(1) AS cnt 
FROM yourTable GROUP BY col_A, (unique_id_col*0 + col_A);

@ গ্লেনফ্রোম আইওয়া আমার সিউডো টেবিলটিকে উপরে বর্ণিত সংজ্ঞায়িত করা হয়নি, এবং আমি 11 জি-র সাথে একটি ফার্মের পক্ষে আর কাজ করি না, আমি এর চেয়ে ভাল উদাহরণ দিতে পারি না, যদিও এটি শেষবার পরীক্ষা করার সময় সমস্যা ছিল।
জোসেফ লাস্ট

4
কৌতূহলের বাইরে আপনি যখন এলোমেলো ফলাফল চান তার উদাহরণ কী? আপনি FOO দ্বারা গ্রুপ করতে চান এবং বারের জন্য একটি এলোমেলো সারি পেতে চান এমন কোনও কারণ আমি ভাবতে পারি না।
কাইল ব্রিজেনস্টাইন

4

আপনি সহ শক্তি কর্মদক্ষতার দ্বারা গোষ্ঠীবদ্ধ থাকে GROUP BYদফা, যে কোন অভিব্যক্তি SELECT, যা গ্রুপ ফাংশনটি (বা সমষ্টিগত ফাংশন বা সমষ্টিগত কলাম) যেমন নয় COUNT, AVG, MIN, MAX, SUMএবং তাই (চালু মোট ফাংশন তালিকা ) এ উপস্থিত থাকা উচিত GROUP BYদফা।

উদাহরণ (সঠিক পথ) (এখানে employee_id, গ্রুপ ফাংশন (অ-সমষ্টিগত কলাম) নয়, তাই এটি আবশ্যক প্রদর্শিত GROUP BY। বিপরীতে SUM (বেতন), একটি গ্রুপ ফাংশন (সমষ্টিগত কলাম), তাই এটি প্রদর্শিত করতে প্রয়োজন হয় না GROUP BYদফা ।

   SELECT employee_id, sum(salary) 
   FROM employees
   GROUP BY employee_id; 

উদাহরণ (ভুল উপায়) (এখানে employee_idগ্রুপ ফাংশন নয় এবং এটি GROUP BYধারাটিতে উপস্থিত হয় না , যা ORA-00979 ত্রুটির দিকে পরিচালিত করবে।

   SELECT employee_id, sum(salary) 
   FROM employees;

সংশোধন করার জন্য আপনাকে নিম্নলিখিতগুলির একটি করতে হবে :

  • তালিকাভুক্ত সমস্ত অ-সমষ্টিগত এক্সপ্রেশন অন্তর্ভুক্ত করুন SELECTদফা GROUP BYদফা
  • সরান গ্রুপ (সমষ্টিগত) থেকে ফাংশন SELECTদফা।

2

আপনার নিম্নলিখিতগুলি করা উচিত:

SELECT cr.review_sk, 
       cr.cs_sk, 
       cr.full_name,
       tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt",
       cs.cs_id, 
       cr.tracking_number
from review cr, cs, fact cf
where cr.cs_sk = cs.cs_sk
       and UPPER(cs.cs_id) like '%' || UPPER(i_cs_id) || '%'
       and row_delete_date_time is null
       and cr.review_sk = cf.review_wk (+)
       and cr.fact_type_code (+) = 183050
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number, cs.cs_id, cr.full_name
ORDER BY cs.cs_id, cr.full_name;

1

UPPER বা LOWER কীওয়ার্ডটি উভয় জায়গায় নির্বাচিত অভিব্যক্তি এবং গোষ্ঠীভিত্তিক গোষ্ঠীতে ব্যবহার না করা হলে একই ত্রুটি ঘটে।

ভুল: -

select a , count(*) from my_table group by UPPER(a) .

ঠিক: -

select UPPER(a) , count(*) from my_table group by UPPER(a) .

1

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

উদাহরণ স্বরূপ:

select d.deptno, max(e.sal) 
from emp e, dept d
where e.deptno = d.deptno
group by d.deptno;

এটি বিভাগগুলিতে সর্বাধিক বেতনের ফলাফল করবে।

এখন যদি আমরা d.deptnoদলটিকে গ্রুপ থেকে বাদ দিয়ে থাকি তবে এটি একই ত্রুটি ঘটবে।


1

অন্যান্য উত্তরগুলির পাশাপাশি, ধারা দ্বারা কোনও আদেশে কোনও অসঙ্গতি থাকলে এই ত্রুটি ঘটতে পারে। এই ক্ষেত্রে:

select 
    substr(year_month, 1, 4)
    ,count(*) as tot
from
    schema.tbl
group by
    substr(year_month, 1, 4)
order by
    year_month
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.