728x90
오라클 WITH란?
오라클에서는 서브쿼리를 임시테이블처럼 사용할 수 있는 WITH구문을 제공하고 있습니다. 통계 데이터를 만든다거나 집계정보를 만든다고 할 때 WITH구문은 아주 유용하게 사용할 수 있습니다. WITH구문을 사용하지 않고 그냥 서브쿼리로 처리해도 쿼리는 만들 수 있을지 모르겠으나 이 구문의 최대 장점은 재활용성에 있습니다. WITH를 선언해 하나의 가상테이블을 만들어 놓고 실제 테이블처럼 여러 번 호출해서 조회를 할 수 있습니다.
오라클 WITH 구문
CREATE TABLE 구문으로 테이블 생성하는 것과 비슷한 구문이지만 AS안에는 서브쿼리에 대한 정보가 들어가고 이 부분이 테이블화 되면서 가상테이블이름을 호출하면 실제 테이블처럼 사용하실 수 있습니다.
WITH 가상테이블명 AS (
SELECT ...
FROM ...
WHERE ...
)
SELECT ...
FROM 가상테이블명;
오라클 WITH 사용 방법
WITH절 선언만 하고 SELECT 쿼리를 작성하지 않으면 구문오류가 발생합니다. WITH절을 선언하면서 데이터를 한번 가공하고 그 내용을 토대로 또 데이터를 가공할 수 있습니다.
-- WITH예제( 고객별 마지막 로그인 이력정보를 가져오는 쿼리 입니다. )
WITH W_MAX_HIST AS (
SELECT CUST_NO, MAX(LOGIN_DATE) AS LAST_LOGIN_DATE
FROM CUSTOMER_HIST
GROUP BY CUST_NO
)
SELECT *
FROM CUSTOMER_HIST A
, W_MAX_HIST B
WHERE A.CUST_NO = B.CUST_NO
AND A.LOGIN_DATE = B.LAST_LOGIN_DATE;
오라클 WITH 중첩 사용
WITH문을 적절하게 잘 사용하면 코드 재사용성을 높일 수 있을 뿐더러 가독성도 높일 수 있습니다. 하지만 실행 순서나 적절한 인덱스를 생각하지 않고 사용하게 되면 쿼리의 성능이 저하될 수 있습니다. 필요에 따라 적절히 쿼리 플랜을 보면서 잘 사용하면 아주 유용한 명령어가 아닐까 싶습니다.
-- 중첩 WITH사용
WITH W_USERS AS (
SELECT '유리' AS USER_NAME, 22 USER_NO FROM DUAL UNION ALL
SELECT '멘탈' AS USER_NAME, 33 USER_NO FROM DUAL UNION ALL
SELECT '디노' AS USER_NAME, 11 USER_NO FROM DUAL
),
W_MAX_USERS AS (
SELECT MAX(USER_NAME) AS USER_NAME
, MIN(USER_NO) AS USER_NO
FROM W_USERS
)
SELECT USER_NAME, USER_NO
FROM W_MAX_USERS;
-- 결과
USER_NAME USER_NO
----------------------
유리 11
728x90
'IT정보' 카테고리의 다른 글
윈도우 예약 종료 (63) | 2023.05.12 |
---|---|
오라클 MINUS 중복체크 (43) | 2023.05.10 |
오라클 KEEP (9) | 2023.05.07 |
오라클 UNION과 UNION ALL의 차이 (0) | 2023.05.05 |
오라클 동적 관리 뷰 (6) | 2023.05.04 |
댓글