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
),
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
),
viewData2 AS
(
SELECT *
FROM TestTable_2
),
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처럼 사용할 수 있어 좋다.
'프로그래밍 언어 > 쿼리문 + Oracle + MySQL' 카테고리의 다른 글
[쿼리문] Merge into를 이용해서 insert나 update를 자동으로 실행하자. (0) | 2015.02.04 |
---|---|
[쿼리문] 조건절에 WHERE 1=1, WHERE 1=0 사용하여 쿼리 간편하게 사용하기 (0) | 2014.11.01 |
[쿼리문/오라클] Oracle에서 중복 조인을 피하기 위한 Update 방법 (MERGE 사용) (0) | 2011.04.01 |
단일행을 다중 row로 분리, 다중 row 결과를 단일행으로 연결하는 방법 (0) | 2011.03.14 |
[쿼리문/오라클] Oracle 저장 프로시저 샘플 (0) | 2011.01.25 |
댓글