Background Image

FORUM

2010.02.23 20:10

group by 오류

조회 수 15347 추천 수 0 댓글 3
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
select a.bo_table, a.bo_subject, bo_image_head from board a left join board_new b on a.bo_table = b.bo_table
where a.ca_id = '103010' group by a.bo_table order by bn_datetime desc for orderby_num() between 1 and 4 

위와 같은 쿼리가 mysql 에서는 되지만 cubrid 최신 버전에서는 안됩니다.

목적은 bo_table 컬럼만 중복제거 하려는 목적입니다

오류 메세지는 다음과 같습니다.

시멘틱: a.bo_subject은(는) 단일 값이 아닙니다. aggregate 질의어 내에 나타난 속성은 "group by" 절 내에 나타나야 합니다.

어떻게 해야하죠?
  • ?
    남재우 2010.02.23 20:45
    안녕하세요.
    CUBRID에서는 group by 사용시 group by 에 영향을 줄 수 있는 모든 필드가 group by 에 명시되어야 합니다. 따라서 select 절에 명시된 필드가 다 들어가야 합니다. 말씀하신 것처럼 bo_table 만 unique 하게 하려면 다른 필드들에 대하여 적절한 원칙을 가지고 질의가 되어야 할 것입니다. 즉, bo_table 이 1인 것에 대하여 bo_subejct 가 1과 2의 값을 가진다면 이중에 하나만 결과로 나와야 하는데 이렇게 하시려면 서브 질의를 이용하거나, 질의 조정이 꽤 필요합니다. 더군다나 정렬은 select 절에 없는 다른 필드를 이용해 정렬이 되고 있으니 조금 시간을 가지고 분석해 봐야 할 것 같습니다.
    분석해 보고 적절한 질의를 올려드리도록 하겠습니다.



  • ?
    초보 2010.02.23 20:51
    답변 감사합니다 질의 올려주시길 부탁드립니다 감사합니다~
  • ?
    남재우 2010.02.24 19:45

    안녕하세요.
    잘 아시겠지만, 혹시나 하여 일반적인 group by 에 대하여 설명을 먼저 드리겠습니다.
    board 테이블에 값이 아래와 같이 있는 경우(순번은 그냥 레코드 순서입니다),
    순번      bo_table      bo_subject
      1       'table1'      'subject1'
      2       'table1'      'subject2'
      3       'table2'      'subject1'
    bo_table이 'table1' 인 경우 bo_subject 는 서로 다른 두개의 값을 가집니다. 이 경우 일반적으로 group by 를 하게되면 질의는 select bo_table,bo_subject from ... group by bo_table,bo_subject 와 같이 대상이 되는 필드가 모드 group by 절에 명시되어야 합니다. 그리고 그 결과는 아래와 같습니다.
    bo_table      bo_subject
    'table1'      'subject1'
    'table1'      'subject2'
    'table2'      'subject1'

    그런데 질문하신 내용이 위와 같은 결과가 아니라 아래와 같은 결과라면 이건 간단히 처리가 않되며, 질의를 꽤 조정해야 합니다. 참고로 bo_subject 의 결과는 'subject1'이 나올지 'subject2'가 나올지는 보장할 수 없습니다.
    bo_table      bo_subject
    'table1'      'subject1'
    'table2'      'subject1'

    정확한 스키마를 알 수 없지만 몇가지 가정을 하고 아래와 같이 정리해봤습니다.
    각 필드는 문자열로 가정했고, order by 에 사용된 필드가 a 테이블의 것이며, 조인되는 두개테이블은 1:1이거나 1:0 을 가정했습니다. 그렇지 않으면 조인에 의해 결과가 늘어나게 되어 group by 처리에 문제가 발생합니다.
    그래서 조정된 질의는 아래와 같습니다. 조건절에 서브질의를 이용한 조건이 들어갔으며 서브질의에서 rownum 을 이용하여 하나의 결과만 가져오도록 하였습니다.
    결과는 원하는대로 나오겠지만 서브질의를 사용함으로써 group by와 orderby_num()이 없는 상태에서의 결과 개수만큼 서브질의가 수행되므로 성능은 좋지 않습니다.
    select a.bo_table, a.bo_subject, bo_image_head
    from board a left join board_new b on a.bo_table = b.bo_table
    where a.ca_id = '103010'
      and (a.bo_subject, a.bn_datetime)
            = (select a.bo_subject, a.bn_datetime
                    from board ab
                    where ab.bo_table = a.bo_table
                      and rownum = 1
            )
    group by a.bo_table, a.bo_subject, bo_image_head, a.bn_datetime
    order by bn_datetime desc for orderby_num() between 1 and 4


  1. CUBRID 사용자를 위한 DBeaver 도구 출시 안내

  2. group by 오류

  3. 테이블명을 한글로 할 수는 없나요?

  4. timestamp 필드 데이터를 다시 timestamp로 변환하기

  5. 리눅스상에서 백업파일의 Backup Time을 알수있는 방법이 있나요?

  6. restoredb 이용한 복구가 제대로 되지 않아요.

  7. 설치 완료후 phpcubAdmin 에서 페이지 열기가 안됩니다.

  8. 컴포지션 관련해서 문의 드립니다.

  9. 리눅스 설치 확인 부탁 드립니다.

  10. // 를 사용하고 싶습니다.

  11. 큐브리드 매니저에서 오류

  12. 내부 아이피 연결시 접속이 안되는 현상

  13. Spatial Extensions 지원하나요?

  14. 542번글 재질의

  15. MS-SQL 데이타타입/함수비교

  16. 큐브리드 매니저에 데이타베이스 복구가 비활성화 되어있습니다

  17. 데이터베이스 검사시에 에러

  18. cci_execute() 에서 lock이 걸리는 현상

  19. 532번글 답변이 아직 없으셔서 다시 올립니다.

  20. 컬럼 수정이 안됩니다.

  21. 2.0에서 2.1로 업그레이드 하려면?

Board Pagination Prev 1 ... 181 182 183 184 185 186 187 188 189 190 ... 213 Next
/ 213

Contact Cubrid

영업문의 070-4077-2112 / 기술문의 070-4077-2148 / 대표전화 070-4077-2110 / Email. contact_at_cubrid.com
Contact Sales