중복자료제거 한줄표시 문의 드립니다. 1 8 4,239

by 동동동 [SQL Query] [2018.04.06 09:26:05]


오라클 12 환경입니다..

한줄로 표시하기 위해 

LISTAGG 를 사용하면 ORA-01489:문자열 연결의 결과가 너무 깁니다. 에러가 발생을 해서

SUBSTR(XMLAGG(XMLELEMENT(....).GETCLOBVAL(), 2) 을 사용했습니다...

 

그런데 중복 자료가 있어서 중복자료를 제거하기 위해 wm_concat(DISTINCT cod) 를 사용하려고 했는데요..

ORA-29925: WM_CONCAT_OBJ.ODCIAGGREGATEINITIALIZE(를)을 수행할 수 없습니다

라는 에러가 발생합니다..

 

1.오라클 12에서는 WM_CONCAT을 사용할 수 없나요?

2.결과값 문자열이 4000이넘는 경우의 중복값 제거는 어떻게 처리해야 하나요?

 

도움 부탁드립니다...

 

 

by 마농 [2018.04.06 09:53:26]

중복값 때문에 4000 이 넘는것은 아닐까요?
중복 제거 후에 Listagg 하면 4000 안 넘는거 아닌가요?
전체 쿼리를 보여주실 수 있는지?


by 동동동 [2018.04.06 10:54:52]
WITH 
COD_TMP AS (
SELECT 'AAAA' COD FROM DUAL UNION ALL
SELECT 'BBBB' COD FROM DUAL UNION ALL
SELECT 'CCCC' COD FROM DUAL
),
NAM_TMP AS (
SELECT 'AAAA' COD, LEVEL||'' COD2, '가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가가' NAM FROM DUAL
CONNECT BY LEVEL <= 10000
UNION ALL
SELECT 'BBBB' COD, '1' COD2, '라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라라' NAM FROM DUAL UNION ALL
SELECT 'BBBB' COD, '2' COD2, '1234567890' NAM FROM DUAL UNION ALL
SELECT 'CCCC' COD, '1' COD2, '아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아' NAM FROM DUAL
)
SELECT C.COD
     , SUBSTR(XMLAGG(XMLELEMENT(x, ',', N.NAM) ORDER BY C.COD).EXTRACT('//text()').GETCLOBVAL(), 2) 
  FROM COD_TMP C, NAM_TMP N
 WHERE C.COD= N.COD
 GROUP BY C.COD

 

샘플자료 만들어 봤습니다...


by 우리집아찌 [2018.04.06 09:56:35]

1.오라클 12에서는 WM_CONCAT을 사용할 수 없나요? -> 없습니다.

2.결과값 문자열이 4000이넘는 경우의 중복값 제거는 어떻게 처리해야 하나요?

-> http://www.gurubee.net/article/55512 ( 댓글보시면 db별 버젼별 잘정리되어있습니다.)


by 동동동 [2018.04.06 11:10:07]

답변 감사드립니다...^^


by 마농 [2018.04.06 11:17:44]
SELECT c.cod
--   , SUBSTR(XMLAGG(XMLELEMENT(x, ',', n.nam) ORDER BY c.cod).EXTRACT('//text()').GETCLOBVAL(), 2) v
     , LISTAGG(n.nam, ',') WITHIN GROUP(ORDER BY c.cod) v
  FROM cod_tmp c
--   , nam_tmp n
     , (SELECT DISTINCT cod, nam FROM nam_tmp) n
 WHERE c.cod= n.cod
 GROUP BY c.cod
;

 


by 동동동 [2018.04.06 14:58:10]

마농님 답변 감사드립니다...그런데..예제가 저렇다는 것이고 실제 자료에서는 바로 DISTINCT를 못하고 반드시 C와 N이 조인된 후에야 값을 알수 있는 상황(?) 이어서요...아....글로 하려니 잘 안되네요...


by 마농 [2018.04.06 15:02:39]

바로 DISTINCT를 못하고 반드시 C와 N이 조인된 후에야 값을 알수 있는 상황(?)을 보여주세요.
저는 Distinct 부터 하고 조인 했지만, 조인부터 하고 Distinct 해도 됩니다.
보여 주신 대로 개선해 드렸습니다.
보여 주신게 실제와 다른 모양이네요.
실제와 유사한걸 보여주세요.

SELECT cod
     , LISTAGG(nam, ',') WITHIN GROUP(ORDER BY cod) v
  FROM (SELECT DISTINCT c.cod
             , n.nam
          FROM cod_tmp c
             , nam_tmp n
         WHERE c.cod= n.cod
        )
 GROUP BY cod
;

 


by 동동동 [2018.04.09 09:38:43]

답변 감사드립니다...

마농님이 알려주신데로..조인에서 먼저 Distinct한 후 다시한번 조회하는 방식으로 처리되었습니다..^^

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