- 오라클 9i R2부터 WITH절을 사용할 수 있도록 기능이 추가되었다
- WITH 절은 임시 테이블 또는 가상 테이블이라고 생각하면 된다.
- 반복되는 서브쿼리 블록을 하나의 WITH 절 블록으로 만들어서 사용하거나, 긴 문장의 서브 쿼리를 WITH절로 만들어서 SELECT문의 가독성을 높일 수 있다.
WITH 절 사용법
다중 WITH 절 사용법 (여러 개)
- WITH 절에 여러 개의 임시 테이블을 만들고 싶을 때는 쉼표(",")를 찍고 이어서 선언하면 된다.
WITH emp_w1 AS
(
SELECT deptno
, AVG(sal) AS sal_avg
FROM emp
GROUP BY deptno
),
emp_w2 AS
(
SELECT job
, AVG(sal) AS sal_avg
FROM emp
GROUP BY job
)
SELECT a.ename
, a.job
, a.sal
, b.sal_avg AS dept_avg
, c.sal_avg AS job_avg
FROM emp a
, emp_w1 b
, emp_w2 c
WHERE a.empno = 7788
AND a.deptno = b.deptno
AND a.job = c.job
예시 1
WITH HIST AS (
SELECT B.HISTORY_ID AS HISTORY_ID
, A.CAR_ID AS CAR_ID
, A.CAR_TYPE AS CAR_TYPE
, A.DAILY_FEE AS DAILY_FEE
, B.DURATION AS DURATION
, CASE WHEN B.DURATION < 7 THEN ''
ELSE CASE WHEN B.DURATION < 30 THEN '7일 이상'
ELSE CASE WHEN B.DURATION < 90 THEN '30일 이상'
ELSE '90일 이상'
END END END AS DURATION_TYPE
FROM CAR_RENTAL_COMPANY_CAR A
, (SELECT HISTORY_ID
, CAR_ID
, END_DATE - START_DATE + 1 AS duration
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY) B
WHERE 1 = 1
AND A.CAR_ID = B.CAR_ID
AND A.CAR_TYPE = '트럭')
SELECT H.HISTORY_ID
, H.DAILY_FEE * H.DURATION * (100 - NVL(A.DISCOUNT_RATE, 0)) / 100 AS FEE
FROM HIST H
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN A
ON H.CAR_TYPE = A.CAR_TYPE
AND H.DURATION_TYPE = A.DURATION_TYPE
ORDER BY FEE DESC, H.HISTORY_ID DESC
;
'DB > 오라클' 카테고리의 다른 글
[Oracle] MERGE (3) | 2024.10.16 |
---|---|
[Oracle] 조건에 맞는 사용자 정보 조회하기 (0) | 2024.09.23 |
[Oracle] SQL 서브쿼리 SELECT,FROM,WHERE (0) | 2024.09.23 |
[Oracle] 문자열 합치는 방법(||, CONCAT()) (0) | 2024.09.23 |
[ORACLE] INSTR() 함수: 문자 찾기 (0) | 2024.09.09 |