2012년 10월 10일 수요일

[oracle] sys_connect_by_path와 대체 쿼리

SYS_CONNECT_BY_PATH
계층형 쿼리에서 하위 레벨의 특정 컬럼들을 한 줄로 표현할 때 사용
ex)
LEVEL COLNM
1         A
2         A1
2         A2
2         A3
1         B
2         B1
2         B2
2         B3

COLNM    SYS_CONNECT_BY_PATH
A             A1,A2,A3
B             B1,B2,B3

모든 사람들이 접근 가능하고 테이블 create하지 않고 조회할 수 있는 scott/tiger로 작업
---------------------------------------------------------------------
SYS_CONNECT_BY_PATH
---------------------------------------------------------------------
SELECT
DEPTNO
,SUBSTR (MAX (SYS_CONNECT_BY_PATH (ename, ',')), 2) ENAME
FROM (
SELECT
DEPTNO
,ENAME
,ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY ENAME) AS RNO
FROM EMP)
START WITH RNO = 1
CONNECT BY PRIOR RNO = RNO-1
AND PRIOR DEPTNO = DEPTNO
GROUP BY DEPTNO
ORDER BY DEPTNO

* 퍼포먼스면에서 문제가 많다고들 한다.

꼭 계층형 쿼리를 써야 하는 부분이 아니라면, 다른 함수들을 사용하는 것이 좋겠지.

---------------------------------------------------------------------
XMLELEMENT
---------------------------------------------------------------------
SELECT
DEPTNO
,SUBSTR(XMLAGG(XMLELEMENT(A,','|| ENAME) ORDER BY ENAME).EXTRACT('//text()'),2) ENAME
FROM EMP
GROUP BY DEPTNO;


---------------------------------------------------------------------
WM_CONCAT
---------------------------------------------------------------------
SELECT
A.DEPTNO
,MAX(A.ENAME) ENAME
FROM (
SELECT
DEPTNO
,WM_CONCAT(ENAME) OVER(PARTITION BY DEPTNO ORDER BY ENAME) ENAME
FROM EMP) A
GROUP BY DEPTNO;

댓글 없음:

댓글 쓰기