WITH 별칭1 AS (SELECT문)
, 별칭2 AS (SELECT문)
SELECT * FROM 별칭1,별칭2
예) 아래와 같이 따로 명시해서 쓸수 있음
WITH TEST1 AS (
SELECT 1 AS RNUM,'TEST1' AS TT FROM DUAL UNION ALL
SELECT 2 AS RNUM,'TEST2' AS TT FROM DUAL UNION ALL
SELECT 3 AS RNUM,'TEST3' AS TT FROM DUAL UNION ALL
SELECT 4 AS RNUM,'TEST4' AS TT FROM DUAL UNION ALL
SELECT 5 AS RNUM,'TEST5' AS TT FROM DUAL
)
, TEST2 AS (
SELECT 1 AS RNUM,'MOD1' AS TT FROM DUAL UNION ALL
SELECT 2 AS RNUM,'MOD2' AS TT FROM DUAL UNION ALL
SELECT 3 AS RNUM,'MOD3' AS TT FROM DUAL UNION ALL
SELECT 4 AS RNUM,'MOD4' AS TT FROM DUAL UNION ALL
SELECT 5 AS RNUM,'MOD5' AS TT FROM DUAL
)
SELECT A.*,B.* FROM TEST1 A,TEST2 B
WHERE 1=1
AND A.RNUM = B.RNUM
그리고 WHIT절에서 명칭으로 선언한 부분중 처음 선언한 부분을 참조할수 있다(TEST1을 명시 후 TEST2를 명시할때 SELECT문 절에서 쓸수 있다.)
※ WITH절은 계층형으로도 만들수 있는데 아래와 같이 만들수 있다.
WITH RECUR ( DEPARTMENT_ID, PARENT_ID, DEPARTMENT_NAME, LVL) AS (
SELECT DEPARTMENT_ID, PARENT_ID, DEPARTMENT_NAME, 1 AS LVL
FROM DEPARTMENTS
WHERE PARENT_ID IS NULL -> START WITH [상위 부분] IS NULL과 같음
UNION ALL
SELECT A.DEPARTMENT_ID, A.PARENT_ID, A.DEPARTMENT_NAME, B.LVL + 1
FROM DEPARTMENTS A, RECUR B
WHERE A.PARENT_ID = B.DEPARTMENT_ID ->CONNECT BY PRIOR DEPARTMENT_ID =PARENT_ID와 같음
)
SEARCH DEPTH FIRST BY DEPARTMENT_ID SET ORDER_SEQ ->해당 부분을 해 줘야 계층형식으로 표현된다.
SELECT DEPARTMENT_ID, LPAD(' ' , 3 * (LVL-1)) || DEPARTMENT_NAME, LVL, ORDER_SEQ
FROM RECUR;
- DEPTH FIRST BY : 같은 노드에 있는 로우로 형제로우보다 자식로우가 먼저 조회
- BREADTH FIRST BY : 자식 로우보다 형제 로우가 먼저 조회한다.(레벨순으로 조회됨)
- 같은 레벨에 있는 형제 로우일때는 BY 다음에 명시한 컬럼순으로 조회
- SET다음에는 가상 컬럼형태로 최종 SELECT절에서 사용가능
'DB > ORACLE' 카테고리의 다른 글
22.[오라클]다중INSERT하기 (0) | 2024.02.18 |
---|---|
21.[오라클]분석함수와window (0) | 2024.02.14 |
19.[오라클]계층형쿼리 (1) | 2024.02.12 |
18.[오라클]서브쿼리 정리 (0) | 2024.02.11 |
17.[오라클]JOIN 관련 정리 (0) | 2024.02.07 |