1HOON
논리적 코딩
1HOON
전체 방문자
오늘
어제
  • HOME (187)
    • ☕️ JAVA (28)
      • WhiteShip Java LIVE Study (6)
      • Effective JAVA (10)
    • 🔮 KOTLIN (4)
    • 🌱 SPRING (51)
      • 스프링 인 액션 (22)
      • JPA (18)
    • ☕️ JAVASCRIPT (6)
    • 📃 DATABASE (40)
      • ORACLE (37)
      • MSSQL (2)
    • 🐧 LINUX (4)
    • 🐳 DOCKER (5)
    • 🐙 KUBERNETES (4)
    • 🏗️ ARCHITECTURE (8)
    • 📦 ETC (27)
      • TOY PROJECT (5)
      • RECRUIT (1)
      • 그냥 쓰고 싶어서요 (14)
      • TIL (1)
    • 🤿 DEEP DIVE (1)
    • 🚽 Deprecated (9)
      • PYTHON (3)
      • AWS (2)
      • HTTP 완벽가이드 (3)
      • WEB (1)

블로그 메뉴

  • 홈
  • 방명록
  • 관리

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
1HOON

논리적 코딩

[SQL] WITH절과 순환 서브쿼리
📃 DATABASE/ORACLE

[SQL] WITH절과 순환 서브쿼리

2018. 1. 15. 21:32

WITH 절

별칭으로 사용한 SELECT문의 FROM절에 다른 SELECT구문의 별칭 참조가 가능하다.

1
2
3
4
5
WITH 별칭1 AS (서브쿼리)
     ,별칭2 AS(서브쿼리)
...
SELECT
FROM    별칭1, 별칭2...
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
WITH B2 AS (SELECT  PERIOD
                    , REGION
                    , SUM(LOAN_JAN_AMT) JAN_AMT
            FROM    KOR_LOAN_STATUS
            GROUP BY PERIOD, REGION)
    , C AS (SELECT  B2.PERIOD
                    , MAX(B2.JAN_AMT) MAX_JAN_AMT
            FROM    B2
                    , ( SELECT  MAX(PERIOD) MAX_MONTH
                        FROM    KOR_LOAN_STATUS
                        GROUP BY SUBSTR(PERIOD, 1, 4) ) A
            WHERE   B2.PERIOD = A.MAX_MONTH
            GROUP BY B2.PERIOD)
SELECT  B2.*
FROM    B2, C
WHERE   B2.PERIOD = C.PERIOD
AND     B2.JAN_AMT = C.MAX_JAN_AMT
ORDER BY 1;
Colored by Color Scripter
cs





순환 서브 쿼리

1
2
3
4
5
6
SELECT  DEPARTMENT_ID
        , LPAD(' ', 3*(LEVEL-1)) || DEPARTMENT_NAME
        , LEVEL
FROM    DEPARTMENTS
START WITH PARENT_ID IS NULL
CONNECT BY PRIOR DEPARTMENT_ID = PARENT_ID;
cs




위 쿼리는 아래 WITH절 순환 서브쿼리로 작성 할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
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
         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
         )
SEARCH DEPTH FIRST BY DEPARTMENT_NAME SET ORDER_SEQ
SELECT  DEPARTMENT_ID, LPAD(' ', 3*(LVL-1)) || DEPARTMENT_NAME, LVL
FROM    RECUR;
Colored by Color Scripter
cs


WHERE  PARENT_ID IS NULL  은 START WITH PARENT_ID IS NULL 과 같고, WHERE  A.PARENT_ID = B.DEPARTMENT_ID 은 CONNECT BY PRIOR DEPARTMENT_ID = PARENT_ID 와 같다.


SEARCH 구문

DEPTH FIRST BY      :  형제 로우보다 자식 로우가 먼저 조회된다.

BREADTH FIRST BY   :  자식 로우보다 형제 로우가 먼저 조회된다.

SET 다음에는 가상 컬럼 형태로, 최종 SELECT 절에서 사용할 수 있다.

같은 레벨에 있는 형제 로우일 때는 BY 다음에 명시한 컬럼순으로 조회된다.




반응형
저작자표시 비영리 변경금지 (새창열림)

'📃 DATABASE > ORACLE' 카테고리의 다른 글

[SQL] WINDOW 함수  (0) 2018.01.16
[SQL] 분석 함수  (0) 2018.01.15
[SQL] 계층형 쿼리  (0) 2018.01.09
[SQL] 내부조인과 외부조인  (0) 2018.01.08
[SQL] 집합 연산자  (0) 2018.01.04
    '📃 DATABASE/ORACLE' 카테고리의 다른 글
    • [SQL] WINDOW 함수
    • [SQL] 분석 함수
    • [SQL] 계층형 쿼리
    • [SQL] 내부조인과 외부조인
    1HOON
    1HOON

    티스토리툴바