sql에서 decode함수가 이상합니다. 혹시 이 문제를 아시는 분 계신가요?

563 views
Skip to first unread message

Guru Master 慧月

unread,
Jul 11, 2013, 2:34:51 AM7/11/13
to ks...@googlegroups.com
안녕하세요. 매일 좋은 정보를 얻어가다가 처음으로 글을 올리게 되었습니다. 

제가 맡은 사이트에서 특정 페이지가 갑자기 통채로 500에러를 토해냈습니다.

핵심원인으로 아래 메세지를 지목했습니다.
--- Cause: com.tmax.tibero.jdbc.TbSQLException:  subquery expected to return a scalar value but returned multiple rows   

이를 바탕으로 추적해 들어가니 

decode()함수 부분에서 위의 오류메세지를 토해냈습니다.
그런데, 문제는 이게 원래 잘 돌아가던 쿼리였다는 것입니다. 

7월이후로 이문제가 있었던 것 같은데, 제가 다른 업무로 정신못쓰는 사이 뻗어버린 것 같았습니다.

좀 더 상세 부연하자면,(해당 쿼리가 너무 길어 문제있는 부분만 요약 추출했습니다.수식관련 부분이라 쿼리한줄이 몇 페이지를 넘어가서;;;)
아래 쿼리가 문제가 되는 부분입니다.

select decode((select member_gubun from table_member where member_id = a.member_id),'GUBUN01',  a.money, 0 ) alias_money from table_donate a;

쉽게 설명해서 어떤 기금에 멤버들이 주기적 혹은 일시적으로 입금을 한 자료에서 멤버종류별로 합을 구하기 위한 쿼리입니다.
원래는 decode함수 바깥에 sum()함수로 감싸두어 decode()함수로 리턴된 테이블의 합을 구했던 구문이었습니다.

그런데 decode함수가 실제로 테이블을 리턴할 수 있다고 알고 있고, 그렇게 해야 sum함수를 사용할 수 있을 텐데 도무지 답이 안보입니다.

정리하자면
1. 원래 되던 구문이 안된다.
2. 같은 decode함수를 전체 구문 내에서 20여개가 들어있는데 위의 10여개는 잘 동작하는데 이구문에서 뻗는다.
3. 시스템은 tibero3입니다. 

혹시 아시는 분 있으시면 부탁드립니다. ㅜㅠ

감사합니다.

최영목

unread,
Jul 11, 2013, 2:55:02 AM7/11/13
to ks...@googlegroups.com
에러 메시지를 보자면 decode내의 서브쿼리에서 여러 행을 반환한다고 하네요.
쿼리 문제라기 보다는 해당 데이터를 살펴보셔야 할 것 같습니다^^

Thank you, Steve (1955-2011)
나의 iPhone에서 보냄

2013. 7. 11. 오후 3:34 Guru Master 慧月 <leo...@gmail.com> 작성:

--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.
http://groups.google.com/group/ksug에서 그룹을 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/groups/opt_out을(를) 방문하세요.
 
 

Guru Master 慧月

unread,
Jul 11, 2013, 3:55:21 AM7/11/13
to ks...@googlegroups.com
넵, 정말 감사합니다. 
문제가 잘 해결 되었습니다. 

저도 혹시나 해서 데이터 살펴보고는 있었는데, 최영목님 답변을 보고 제가 착각한 것을 알았습니다.
저같은 초보가 헤메지 않게 해결 상황 설명하고자 합니다.

subquery expected to return a scalar value but returned multiple rows   
이 에러메세지의 multiple rows라는 대목을 저는 서브쿼리에서 반환된 결과값이 multiple rows여서 오류인 것으로 오해했던 것입니다.

그런데, 제가 사용했던 쿼리에서 member_id = a.member_id 항목이 있는데, 값을 가지고 있는 a테이블의 값을 가지고 참조하고자 하는 테이블(table_member)의 member_id로 비교 하고자 하자면, 1:N비교가 되어야 합니다. 그런데, table_member에 있는 member_id가 PK인데도 불구하고 최근 몇달간 몇몇 케이스에서 중복이 되고 있어서 위와 같은 오류메세지를 낸 것입니다.

정리하자면, 서브쿼리 결과 중에 단일값으로 예상되는 부분이 중복값을 가지고(보여주고, 반환하고) 있다라는 메세지로 생각해야 할 듯 합니다.
영어가 짧은 거겠죠.ㅜㅠ

덕분에 한참 헤맬뻔 했던 것 쉽게 처리 하였습니다. 

감사합니다.

2013년 7월 11일 목요일 오후 3시 55분 2초 UTC+9, 최영목 님의 말:
Reply all
Reply to author
Forward
0 new messages