يلقي SQL Query "ليس في الوظيفة الإجمالية أو المجموعة حسب البند" استثناء

StackOverflow https://stackoverflow.com/questions/581043

  •  06-09-2019
  •  | 
  •  

سؤال

أنا أعمل على إصلاح جناح الاختبار لمشروع لنا، الذي يتم اختباره من خلال السبات / dBunit. هناك العديد من حالات الاختبار التي رمي جميعا استثناء مماثل من السبات، والتي تبدو مثل هذا:

java.sql.sqlexgection: ليس في الوظيفة الإجمالية أو المجموعة حسب الفقرة: Org.hsqldb.expression@109062E في العبارة [... BLAH ...

من خلال Googling الخاص بي، أشكر في أن هذا ناتج عن استخدامنا لوظيفة AVG () AVG () في رسالة الاستثناء، كما هو الحال في رسالة الاستثناء، وجميع الاستعلامات التي تحتوي على احتواءها. ومع ذلك، اكتشفت العديد من الروابط للأشخاص الذين كانوا يحصلون على هذا الخطأ، وكانوا قادرين على إصلاحه إما عن طريق التعليق على "ترتيب حسب" أو "المجموعة بواسطة" جملة "، أو عن طريق تضمين الأعمدة الأخرى من جملة المختارة في المجموعة. أنا أفهم لماذا سيعمل ذلك على إصلاح رسالة الخطأ هذه، لكنني لست متأكدا مما إذا كان ينطبق على وضعي، لأنني حاولت القيام بنفس الشيء ولم يحدث فرقا. أيضا، لدينا بعض حالات الاختبار إلقاء الاستثناءات التي تستخدم النظام / المجموعة، ولكن ليس كل شيء. علي سبيل المثال:

ThingerVO myThinger = (ThingerVO)session.createQuery("SELECT new ThingerVO(" +
"r.id, " + "u.id, " + "u.alias, " + "s.id, " +
"s.name, " + "r.URL," + "AVG(v.rating), " +
"r.totalCount, " + "r.isPrivate, " + "a.id, " +
"a.name, " + "r.transactionId, " + "r.size, " +
"u.hasPicture " +
") FROM Thinger r LEFT OUTER JOIN r.votes as v, Table1S s " +
"JOIN s.Table2A AS a, User u " +
"WHERE r.userId = u.id AND " +
"s.id = r.Table1SId AND " +
"r.id = :thingId")    
.setInteger("thingId", thingId)
.uniqueResult();

يؤدي هذا الاستعلام أيضا إلى إلقاء نفس الاستثناء، على الرغم من أنه لا يستخدم بند طلب / مجموعة. أيضا، قمت بقطع / لصق رمز HSQL الذي تم إنشاؤه من السبات مباشرة في متصفح استعلام MySQL، وارتفع دون مشاكل. أيضا، تجدر الإشارة إلى أن كل هذا الرمز يعمل بشكل جيد في قاعدة بيانات الإنتاج الخاصة بنا، لذلك أنا مرتبك حقا لماذا يلقي هنا.

بعض المعلومات الأخرى التي يحتمل أن تكون مفيدة - نحن نستخدم بنية قاعدة بيانات XML شقة مع بعض بيانات اختبار دمية لحالات الاختبار، ولهجة MySQL للسبات. نحن نستخدم DBUNIT 2.4.3 / hibernate 3.2.6. حاولت استخدام أحدث السبات، الإصدار 3.3.1، لكنه تصرف نفسه.

أي مؤشرات أو تلميحات سيكون موضع تقدير كبير.

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم وظيفة إجمالية (على سبيل المثال AVG()) في الجزء المحدد من استعلام SQL إلى جانب التعبيرات غير المجمعة الأخرى، يجب أن يكون لديك مجموعة من جملة يجب أن تسرد جميع التعبيرات غير الإجمالية.

أنا لست معتادا على Java، ولكن بالنظر إلى التعليمات البرمجية، يبدو أنه سيخلق واستعلام عن شيء مثل هذا (ليس صحيحا تماما، ولكن قريبا بما يكفي، وأعتقد):

SELECT r.id, 
       u.id,
       u.alias,
       s.id, 
       s.name, 
       r.URL, 
       AVG(v.rating), 
       r.totalCount, 
       r.isPrivate, 
       a.id, 
       a.name, 
       r.transactionId,
       r.size, 
       u.hasPicture 
FROM Thinger r 
LEFT OUTER JOIN r.votes as v, 
                     Table1S s 
JOIN s.Table2A AS a, User u 
WHERE r.userId = u.id 
AND s.id = r.Table1SId 
AND r.id = :thingId

... هذا لا يوجد لديه GROUP BY, ، ولكن هل مزيج التعبيرات الإجمالية وغير المجمعة في جملة Select. المشكلة هي أنه يتم تشكيل SQL بشكل سيء.

الإصلاح سيكون لإضافة GROUP BY إلى نهاية الاستعلام.

لا أستطيع أن أقول لماذا يعمل هذا في نظام الإنتاج الخاص بك، لكنني أظن أن هناك بعض الفرق الدقيق هناك. ربما شيء يضيف GROUP BY تلقائيا؟

يمكنك نشر نسخة مطبوعة من SQL ينفذ؟

نصائح أخرى

أيضا، ORDER BY لا يعمل في HSQLDB عندما لا يكون الحقل حسب الطلب سلسلة.

لسوء الحظ، هذا يؤدي إلى ليس في الوظيفة الإجمالية أو المجموعة بشرط رسالة الخطأ، التي تشير إلى مشكلة تجميع، وبالتالي الارتباك ...

يرى: http://markmail.org/message/42vmifme4opz4jgl.

في بعض الأنظمة (على سبيل المثال Talend) لا يعمل استعلام إذا كان هناك خطوط تعليق مثال:

SELECT r.id,   
   u.alias,
   AVG(v.rating), 
   r.totalCount
FROM Thinger r 
LEFT OUTER JOIN r.votes as v, 
                     Table1S s 
JOIN s.Table2A AS a, User u 
WHERE r.userId = u.id 
AND s.id = r.Table1SId 
AND r.id = :thingId
--AND r.name is not null 
GROUP BY r.id, u.alias, r.totalCount

يعطي خطأ لاستعلامات MS SQL. بدلا من خط التعليق

--

استخدم هذه الرموز للتعليق

/ * و r.name ليس فارغا * /

ربما سوف يساعد شخص ما وحفظ بعض الوقت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top