2014/05/02

[Oracle] 여러 레코드를 콤마구분자 포함 하나의 레코드로 표현

아래의 CD 컬럼을 1000,2000,3000,4000 처럼 콤마(,)구분자로 구분하면서 하나의 레코드로
표현하는 방법이 ORACLE 9i 와 ORACLE10g 에서의 지원하는 함수에 따라 엄청난 차이를 보인다.
WITH T AS
(
SELECT '1000' AS CD FROM DUAL UNION ALL
SELECT '2000' AS CD FROM DUAL UNION ALL
SELECT '3000' AS CD FROM DUAL UNION ALL
SELECT '4000' AS CD FROM DUAL
)

Oracle 9i 에서는 계획적으로 계층구조를 만들어서 SYS_CONNECT_BY_PATH 함수를 이용해야 한다.
SELECT SUBSTR(MAX(SYS_CONNECT_BY_PATH(CD, ',')), 2) AS CD
  FROM (
        SELECT CD
             , ROW_NUMBER() OVER(ORDER BY CD) AS RNUM
          FROM T
       )
START WITH RNUM = 1 
CONNECT BY PRIOR RNUM = RNUM - 1

그러나, oracle10g 에서는 내장함수인 WMSYS.WM_CONCAT을 이용하면 아주 간단하게 표현된다.
SELECT WM_CONCAT(CD)
  FROM T

단, 이런 재귀쿼리는 대량의 데이터를 대상으로 할 때에는 퍼포먼스가 심각하게 떨어진다.

댓글 없음:

댓글 쓰기