WITH절은 복잡한 SQL에서 동일 블록에 대해 반복적으로 SQL문을 사용하는 경우 자주 실행되는 경우 한번만 Parsing되고 Plan 계획이 수립되므로 쿼리의 성능향상에 도움이 된다.
WITH APPLE AS
(
SELECT '사과' AS FRUIT_NAME
FROM FRUIT
)
SELECT * FROM APPLE
WITH APPLE AS (
SELECT '사과' FRUIT_NAME FROM FRUIT
UNION ALL
SELECT '풋사과' FRUIT_NAME FROM FRUIT
),
'BANANA' AS (
SELECT '바나나' FRUIT_NAME FROM FRUIT
UNION ALL
SELECT FRUIT_NAME FROM APPLE
)
SELECT * FROM BANANA
WITH FRUIT_SET AS (
SELECT * FROM FRUIT
WHERE FRUIT_QTY BETWEEN 2 AND 5
SELECT * FROM FRUIT_SET WHERE FRUIT_NAME ='사과'
UNION ALL
SELECT * FROM FRUIT_SET WHERE FRUIT_NAME ='풋사과'
UNION ALL
SELECT * FROM FRUIT_SET WHERE FRUIT_NAME ='바나나'
계층형 구조는 상하 수직관계의 트리형태의 구조로 이루어진 형태이다.
오라클에서의 계층형 쿼리는 START WITH CONNECT BY 절로 생성할 수 있으며 계층형 정보로 표현할 수 있다.
위 사진과 같은 계층으로 임의로 테이블과 데이터를 생성했다.
CREATE TABLE TEMP_STORE (
KIND_CD NUMBER NOT NULL, -- 종류코드
PARENT_CD NUMBER, -- 상위코드
FRUIT_NAME VARCHAR2(100) NOT NULL, -- 부서이름
PRIMARY KEY (KIND_CD)
);
INSERT INTO TEMP_STORE VALUES ( 101, NULL, '가게');
INSERT INTO TEMP_STORE VALUES ( 102, 101, '과일');
INSERT INTO TEMP_STORE VALUES ( 103, 101, '고기');
INSERT INTO TEMP_STORE VALUES ( 104, 101, '야채');
INSERT INTO TEMP_STORE VALUES ( 105, 102, '복숭아');
INSERT INTO TEMP_STORE VALUES ( 106, 103, '돼지고기');
INSERT INTO TEMP_STORE VALUES ( 107, 103, '소고기');
INSERT INTO TEMP_STORE VALUES ( 108, 105, '천도복숭아');
INSERT INTO TEMP_STORE VALUES ( 111, 104, '오이');
INSERT INTO TEMP_STORE VALUES ( 109, 106, '삼겹살');
INSERT INTO TEMP_STORE VALUES ( 100, 106, '돼지목살');
SELECT
FRUIT_NAME,
KIND_CD,
PARENT_CD,
LEVEL
FROM TEMP
START WITH PARENT_CD IS NULL --최상위 설정,
CONNECT BY PRIOR KIND_CD = PARENT_CD --부모노드와 자식노드 연결
ORDER BY LEVEL