반응형
from okjsp.pe.kr
다른 사이트에서 찾았습니다.. 검색해보니 옥희에는 없는듯해서 올립니다.
오라클 9 이상에서 된다고 하는군요..
SYS_CONNECT_BY_PATH 쓰면 됩니다.
이하 원문 출처 : http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1010&seq=58
-------------------------------
글쓴이 : 김홍선 * SYS_CONNECT_BY_PATH 함수는 연결하려는 문자열의 수가 많아질 경우, 해당 쿼리의 performance 에 문제가 생길 수 있습니다. 충분히 테스트하고 적용하시기 바랍니다. SYS_CONNECT_BY_PATH 함수 사용으로 performance 에 문제가 생길 경우, plsql로 해결하시면 되겠습니다. 예제 1) 다중 Row 결과를 단일행으로 컴마로 분리해 출력하는 방법(1) 에서, 만약 행들이 그룹번호에 따라 그룹으로 나뉘어져 있고, 각 그룹별로 하나의 행으로 컴마로 분리해 출력하려고 하면 어떻게 해야 할 것인가? 이름 그룹 ========== 홍길동 1 김길동 1 이길동 1 홍순신 2 김순신 2 이순신 2 ========== --> 그룹 이름 ====================== 1 홍길동,김길동,이길동 2 홍순신,김순신,이순신 ====================== emp.ename 컬럼, 그리고 그룹번호로 emp.deptno 컬럼을 예로 들어 쿼리를 구성해 보자. emp 테이블의 deptno, ename 컬럼은 아래와 같다. 10 CLARK 10 KING 10 MILLER 20 ADAMS 20 FORD 20 JONES 20 SCOTT 20 SMITH 30 ALLEN 30 BLAKE 30 JAMES 30 MARTIN 30 TURNER 30 WARD 쿼리와 쿼리 결과는 아래와 같다. 쿼리에서 정확히 어떤 컬럼들이 어떤 역할을 하는지 이번에도 숙지하도록 하자. SELECT deptno, SUBSTR (MAX (SYS_CONNECT_BY_PATH (ename, ',')), 2) path# FROM (SELECT ename, deptno, ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY ename) rnum FROM emp) START WITH rnum = 1 CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR deptno = deptno GROUP BY deptno 10 CLARK,KING,MILLER 20 ADAMS,FORD,JONES,SCOTT,SMITH 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD 예제 2) 이번에는 deptno 와 같이 그룹으로 나뉘는 컬럼이 2개(deptno,job) 일 때를 고려해 보자. (group by deptno, job) 3개 이상도 비슷한 방법으로 해결한다. 즉 아래의 테이블을, 10 CLERK MILLER 10 MANAGER CLARK 10 PRESIDENT KING --------------------------- 20 ANALYST FORD 20 ANALYST SCOTT 20 CLERK ADAMS 20 CLERK SMITH 20 MANAGER JONES --------------------------- 30 CLERK JAMES 30 MANAGER BLAKE 30 SALESMAN ALLEN 30 SALESMAN MARTIN 30 SALESMAN TURNER 30 SALESMAN WARD 아래와 같이 출력이 되도록 쿼리를 만들어 보자. 10 CLERK MILLER 10 MANAGER CLARK 10 PRESIDENT KING 20 CLERK ADAMS,SMITH 20 ANALYST FORD,SCOTT 20 MANAGER JONES 30 CLERK JAMES 30 MANAGER BLAKE 30 SALESMAN ALLEN,MARTIN,TURNER,WARD 쿼리는 아래와 같다. 1번 예제의 쿼리에서 추가된 부분을 눈여겨 보자. SELECT deptno, job, SUBSTR (MAX (SYS_CONNECT_BY_PATH (ename, ',')), 2) path# FROM (SELECT deptno, job, ename, ROW_NUMBER () OVER (PARTITION BY deptno, job ORDER BY ename) rnum FROM emp) START WITH rnum = 1 CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR deptno = deptno AND PRIOR job = job GROUP BY deptno, job * 글쓴이 : 김홍선 * 위 내용을 이 곳에서 처음 보신분은 다른 곳에 게재하실 때 반드시 출처를 밝혀주시기 바랍니다. * 위 내용에 관해서 잘못된 부분이 있거나 질문이 있으신 분은 답글로 알려주시기 바랍니다. |
||
|
'전산Tip > Oracle' 카테고리의 다른 글
오라클 10g - 컬럼명의 언더바 기준으로 단어 분리하기 (0) | 2008.10.02 |
---|---|
Oracle 시퀀스 Export 스크립트 (0) | 2008.09.24 |
Oracle 데이터사전 정보조회 (0) | 2008.09.24 |