본문으로 건너뛰기

With절의 사용


with절을 하나의 임시테이블 이라 생각

WITH premium_members AS
(
SELECT
g.upgrade_date,
l.start_level,
l.current_level
FROM
MemberMedal g
INNER JOIN
MemberLevel l
ON g.memberNo = l.memberNo
WHERE l.current_level = 5
)
SELECT
member.name,
member.location,
premium_members.current_level
FROM
member m
INNER JOIN
premium_members p
ON m.memberNo = p.memberNo

MemberMetal정보와 MemberLevel정보를 InnerJoin한 데이터가 premium_members이고 이것을 with절에 담았다. 그 후에 member테이블과 premium_members의 데이터를 결합해서 원하는 데이터를 출력한다.

밑에와 같이 with로 여러개를 사용할 수도 있다.

WITH EXAMPLE1 AS ( --첫번째 WITH문
SELECT 'EX1' A FROM DUAL
UNION ALL
SELECT 'EX2' FROM DUAL
),
EXAMPLE2 AS ( --두번째 WITH문
SELECT 'EX3' A FROM DUAL
UNION ALL
SELECT A FROM EXAMPLE1 --첫번째 WITH문 참조
)

SELECT * FROM EXAMPLE2

with절의 적절한 사용.

밑에과 같이 with절 내부를 불러오는것을 여러번 반복하는것이 with의 효율이 극대화 된다.
with절을 한번만 쓰는것은 서브쿼리와 다를것이 없다.
with절을 한번 올려놓고 계속 재사용하는것에 의미가 있다. with구문을 여러번 참조하는 쿼리일때 with을 쓰자.

WITH EX AS (
SELECT * FROM PRODUCTS
WHERE
STANDARD_COST > 1000
)

SELECT * FROM EX WHERE EX.CATEGORY_ID = '1'
UNION ALL
SELECT * FROM EX WHERE EX.CATEGORY_ID = '2'
UNION ALL
SELECT * FROM EX WHERE EX.CATEGORY_ID = '3'