MSSQL문의 저장프로시저를 분석해서 자바 배치를 만드는 작업을 하던 중에.. 막히는 부분이 있었다.
MSSQL의 저장프로시저에는 무조건 쿼리를 만들어 임시테이블에 넣고,
그 임시테이블을 가지고 이것저것 조건을 건 다음에 다시 다른 임시테이블에 넣는 작업이 반복되고 있었다.
며칠을 고민한 끝에 오라클의 WITH문을 발견하고 '만세~!'를 불렀다. ㅋ
WITH문을 사용하면 자유자재로 쿼리를 뷰처럼 재사용할 수 있었기 때문이다.
WITH viewData AS
(
SELECT *
FROM TestTable_1
)
SELECT *
FROM viewData
;
이건 WITH 문의 기본 문장이다.
WITH name AS ( 쿼리 )
그런데, WITH문에 다중 쿼리를 사용하면 그 위력이 엄청나게 된다.
WITH viewData1 AS
(
SELECT *
FROM TestTable_1
),
WITH viewData2 AS
(
SELECT *
FROM TestTable_2
)
SELECT V1.id,
V2.name,
V2.address
FROM viewData1 V1,
viewData2 V2
WHERE V1.id = V2.id
AND V1.name LIKE '최%'
;
이런 정도의 쿼리라면 굳이 WITH문을 사용할 필요가 있을까?
다음 쿼리를 보자.
WITH viewData1 AS
(
SELECT *
FROM TestTable_1
),
WITH viewData2 AS
(
SELECT *
FROM TestTable_2
),
WITH viewData3 AS
(
SELECT V1.id,
V2.name,
V2.address
FROM viewData1 V1,
viewData2 V2
WHERE V1.id = V2.id
AND V1.name LIKE '최%'
)
SELECT *
FROM viewData3
WHERE ROWNUM <= 100
;
이런식으로.. 위에서 정의한 viewData1, viewData2를 아래 WITH문에서 호출해서 사용할 수 있다.
갯수는 계속 추가해서 사용할 수 있으니 WITH문으로 임시테이블이나 View처럼 사용할 수 있어 좋다.