[ORACLE] START WITH, CONNECT BY - 계층적쿼리
원글 URL : http://stillrabbit.blogspot.com/2008/01/oracle-start-with-connect-by-prior.html
START WITH와 CONNECT BY 는 오라클에서만 가능한 함수로서 데이터를 계층구조로 가져올 수 있다.
◈ START WITH
- 계층 질의의 루트(부모행)로 사용될 행을 지정 합니다..
- 서브쿼리를 사용할 수도 있습니다.
◈ CONNECT BY
- 이 절을 이용하여 계층 질의에서 상위계층(부모행)과 하위계층(자식행)의 관계를 규정 합니다.
- 보통 PRIOR 연산자를 많이 사용 합니다..
- 서브쿼리를 사용할 수 없습니다..
- PRIOR이 붙는 column 이 가져온 row 의 column을 의미한다. 즉 상위에 존재할 데이타가 되게 된다. 어느쪽에 붙느냐 잘 따져 본다.
◈ CONNECT BY의 실행순서는 다음과 같습니다.
- 첫째 START WITH절
- 둘째 CONNECT BY 절
- 세째 WHERE 절 순서로 풀리게 되어있습니다.
◈ SYNTEX
SELECT FROM START WITH CONNECT BY PRIOR AND ORDER SIBLINGS BYor
SELECT FROM WHERE START WITH CONNECT BY PRIOR ORDER SIBLINGS BY
◈ 이용
1) 쇼핑목 카테고리 관계 - 대분류, 중분류, 소분류 등을 트리 구조로
2) 게시판 에서 일반글 과 답글과의 관계 등을 트리 구조로
◈ 데이터가 많아질 경우....
- 첫째로 풀리는 START WITH job='PRESIDENT' job 컬럼에 index가 생성되어 있지 않는다면 속도를 보장할 수 없습니다.
- 그리고 둘째로 풀리는 CONNECT BY PRIOR empno = mgr 역시 PRIOR 쪽의 컬럼값이 상수가 되기 때문에 MGR컬럼에 index를 생성하여야 CONNECT BY의 속도를 보장할 수 있습니다.
- 계층구조를 CONNECT BY, START WITH로 풀면 부분범위 처리가 불가능하고 Desc으로 표현하기가 어렵 습니다.
◈ 예제
SELECT A.BBSSEQ, LPAD(' ', LEVEL * 4) || A.title FROM ( SELECT * FROM KBBS02MT WHERE SITECD = 'ART' AND BBSCD='AR2' ) A -- START WITH UppBBsSeq IN (select UppBBsSeq='0' or UppBBsSeq='1') START WITH UppBBsSeq = '0' //일종의 WHERE절. UppBBsSeq가 0인 레코드부터 계층적 쿼리 수행 CONNECT BY PRIOR BbsSeq = UppBbsSeq //CONNECT BY - 각각의 행들이 어떻게 연결되어야 하는지(JOIN) 정보를 작성한다. //PRIOR - BbsSeq를 참조하는 UppBbsSeq 컬럼이 속한 레코드를 모두 찾아라.(하위seq를 찾을 수 있다)
◈ LEVEL 키워드 - 오라클에서 실행되는 쿼리내 ROWNUM과 같은 가상컬럼이다.
SELECT A.BBSSEQ, LPAD(' ', LEVEL * 4) || A.title FROM ( SELECT * FROM KBBS02MT WHERE SITECD = 'ART' AND BBSCD='AR2' ) A START WITH UppBBsSeq = '0' CONNECT BY PRIOR BbsSeq = UppBbsSeq AND LEVEL < 3 //CONNECT BY 절내에 위치
'DBMS > ORACLE' 카테고리의 다른 글
[ORACLE] DROP TABLE (0) | 2009.11.13 |
---|---|
ORACLE ROWNUM의 동작 원리와 활용 방법 (0) | 2009.10.21 |
ORACLE rownum 설명.. 그리고 hint 절을 사용하자.. 게시판 페이지처리 (0) | 2009.10.20 |
[JAVA] String 형식을 Timestamp 형식으로 변환시키기
JSP에서 알면 간단하면서도 모르면 고생하는 것이 날짜를 받아서 DB에 넣는 것이 아닐까요?
입력이 request를 통해 들어올 때 getParameter 메소드로는 문자열 밖에 못 받는데, 이걸 DB에서 인식하는 Timestamp 형태로 바꾸기 위해서 가장 무식한 형태는 년,월,일,시,분,초 형태로 짤라서 넣기 ㅡ.ㅡ;
이걸 Date로 넣을 경우 오류가 발생하기도 해서 java.sql.date를 안 쓰고 java.sql.timestamp를 쓰는데 정말 간단한 형태를 지원합니다.
Timestamp.valueOf("2009-03-01 10:10:05"); 형태로 집어넣는 겁니다.
그러기에 이를 쓰기 위한 메소드는 두 줄이면 끝납니다.
import java.sql.Timestamp; public Timestamp getTimestamp(String str){ return Timestamp.valueOf(str); }위의 문자열 형태는 규칙에 따르면 yyyy-mm-dd hh:mm:ss.fffffffff 형식입니다.
위에서 보는 것과 같이 timestamp는 나노 세컨드까지 지원하는 반면, java.sql.date는 밀리 세컨드까지만 지원합니다.
이 때문에 처리할 때 좀 달라지는 경우가 생깁니다.
'JAVA' 카테고리의 다른 글
[JAVA] 이미지(Image)사이즈 얻기 (0) | 2009.12.01 |
---|---|
[JAVA] Java Serialization (0) | 2009.11.24 |
[JAVA/TOMCAT/SESSION] HTTPS<->HTTP, 세션 공유 (1) | 2009.11.24 |