DB/ORACLE

20.[오라클]WITH절

혼자좀비 2024. 2. 14. 15:58

 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