오라클쿼리 0 1 522

by 밍밍밍밍 [Oracle 기초] [2020.04.08 19:00:42]


회원번호 성별 특이사항 상담내용
1 M 없음 상담11///상담222
2 F 있음 상담333///상담444

 

안녕하세요.

쿼리 SELECT하는데 어려움이 있어 글남겨드립니다.

MEMBER에 회원번호, 성별

SEEKER에 특이사항

COUNSEL에 상담내용이 있습니다.

 

다른값들은 로우마다 하나씩있어서 상관없는데 상담내용이 한로우에 여러개가 있습니다.

그래서 한줄로 뽑으려고 상담내용을 ///구분자로 뽑으려고 아래 쿼리로 돌리면 값이 나오긴합니다.

 

SELECT M.memb_no,M.NAME, S.SPEC_CONT
 ,LISTAGG(C.COUNS_CONT,'///') WITHIN GROUP(ORDER BY C.JS_NUM, C.JS_YYYYMM) AS cont
 FROM  MEMBER M,                 SEEKER S  , COUNSEL C
 WHERE  S.MEMB_NO = M.MEMB_NO AND S.JS_NUM = C.JS_NUM  AND S.JS_YYYYMM = C.JS_YYYYMM
  AND  SUBSTR(S.WISH_DT,0,4) = '2011'                                                          
   AND  SUBSTR(S.WISH_DT,5,2) BETWEEN   '01'  AND '12'          
    GROUP BY M.memb_no,M.NAME, S.SPEC_CONT

 

1. SELECT는 되는데 전체조회시  result of string concatenation is too long 에러가 나옵니다.

   상담내용부분때문인거같은데 글자수가 초과되어서 그런건가요? 아니면 다른이유때문인가요?

 

by 마농 [2020.04.09 08:13:25]
SELECT m.memb_no
     , m.name
     , s.spec_cont
-- 4000 Byte 초과시 오류 발생 --
--   , LISTAGG(c.couns_cont, '///') WITHIN GROUP(ORDER BY c.js_num, c.js_yyyymm) AS cont
     , SUBSTR(
       XMLAgg(XMLElement(x, '///', c.couns_cont) ORDER BY c.js_num, c.js_yyyymm)
       .Extract('//text()').getCLOBval()
       , 4) AS cont
  FROM member m
     , seeker s
     , counsel c
 WHERE s.memb_no   = m.memb_no
   AND s.js_num    = c.js_num
   AND s.js_yyyymm = c.js_yyyymm
   AND s.wish_dt LIKE '2011%'
--   AND SUBSTR(s.wish_dt, 1, 4) = '2011'               -- 컬럼 가공은 안좋음
--   AND SUBSTR(s.wish_dt, 5, 2) BETWEEN '01' AND '12'  -- 당연한 조건은 굳이 안줘도 됨
 GROUP BY m.memb_no, m.name, s.spec_cont
;
-- http://gurubee.net/article/55512

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입