[Oracle 11g] group by로 그룹핑한 row들의 문자열 합치기(concat)

Published on: 2013. 12. 18. 13:23 by louis.dev

Oracle 11g에 LISTAGG라는 function이 추가되었습니다. 이 function은 group by로 그룹핑된 문자열 row들을 하나의 컬럼으로 결합시키는 역할을 하게 됩니다. 간단하게 예를 들어보도록 하겠습니다.



 DEPTNO

 NAME

 1

 김태희

 1

 전지현

 2

 성나정

 3

 고아라 


위의 데이터에서 부서번호(DEPTNO)가 1인 사원들의 이름을 한번에 뽑고 싶을 경우에는 아래와 같은 쿼리를 사용하면 됩니다.

SELECT
	deptno, LISTAGG(name, ',') within group (order by name) name
FROM
	test_tb
where deptno = 1
group by deptno;

LISTAGG(결합시킬 컬럼, ROW 사이의 결합 문자) within group (해당 그룹 사이의 정렬조건)

으로 간단하게 사용할 수 있습니다


위 쿼리를 실행하면 결과값은 아래처럼 나오게 됩니다.


DEPTNO 

NAME 

김태희, 전지현 



[Oracle] start with connect by prior 사용하여 상하 관계 데이터 처리하기

Published on: 2013. 11. 14. 16:18 by louis.dev
오라클에서 데이터를 저장하다 보면 한 테이블 내에 부모 자식 관계(상하위 관계)로 표현하는 데이터가 발생될 때가 있다. 예를 들어
게시판 ↳ 공지사항 게시판 ↳ 사용자 게시판
와 같이 메뉴를 저장하는 테이블이 있다면 상위 게시판이라는 메뉴는 하위에 공지사항 게시판 메뉴, 사용자 게시판 메뉴를 하위로 가진다면, 데이터 구조는 다음과 같이 생성될 것이다.
MENUID NAME URL PARENTMENUID
1 공지사항 게시판 /notice.html 2
2 게시판 /index.html null
3 사용자 게시판 /user.html 2
만약 쿼리를 상위 메뉴 데이터를 먼저 나오게 하고 그 뒤에 하위 메뉴들을 나오게 하려면 어떻게 해야할까? 이때 Oracle에서는 start with, connect by prior를 사용하여 데이터를 셀렉트 할수 있다.
SELECT
	menuid, name, url, parentmenuid
FROM menu
START WITH parentmenuid is null	/*상위(부모)의 조건을 명시*/
CONNECT BY PRIOR menuid = parentmenuid	/*상위의 키와 하위의 키를 열결시킴*/
ORDER SIBLINGS BY menuid ASC;	/*하위데이터 정렬 조건*/
이렇게 쿼리를 사용하게 되면 다음과 같이 셀렉팅이 된다.
MENUID NAME URL PARENTMENUID
2 게시판 /index.html null
1 공지사항 게시판 /notice.html 2
3 사용자 게시판 /user.html 2