표현하는 방법이 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
단, 이런 재귀쿼리는 대량의 데이터를 대상으로 할 때에는 퍼포먼스가 심각하게 떨어진다.
댓글 없음:
댓글 쓰기