SQL 쿼리는 "집계 함수 또는 그룹별로 그룹이 아닌"예외를 던졌습니다.

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

  •  06-09-2019
  •  | 
  •  

문제

저는 최대 절전 모드/DBUNIT를 통해 테스트되는 프로젝트의 테스트 스위트를 수리하려고합니다. Hibernate에서 비슷한 예외를 던지는 몇 가지 테스트 사례가 있습니다.

java.sql.sqlexception : 조항에 의한 집계 함수 또는 그룹이 아님 : org.hsqldb.expression@109062e에서 [... blah ...

내 인터넷 검색을 통해, 나는 이것이 예외의 메시지에 있기 때문에 집계 함수 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 쿼리 브라우저로 직접 잘라 내고 붙여 넣었고 문제없이 실행되었습니다. 또한이 모든 코드가 프로덕션 데이터베이스에서 잘 작동한다는 점을 지적 할 가치가 있으므로 왜 여기에 던져 지는지에 대해 정말 혼란스러워합니다.

다른 잠재적으로 유용한 정보 - 테스트 사례에 대한 더미 테스트 데이터와 최대 절전 모드에 대한 MySQL 방언이 포함 된 평평한 XML 데이터베이스 구조를 사용하고 있습니다. 우리는 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, 그러나 선택 절에서 집계 및 비 응집 표현을 혼합합니다. 문제는 SQL이 잘못 형성된다는 것입니다.

수정은 a를 추가하는 것입니다 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은 null이 아닙니다 */

어쩌면 그것은 누군가를 돕고 시간을 절약 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top