예시)
SELECT 계약번호, 관리부서명, 계약일, 고객형태, 계약구분, 고객주소
FROM 계약 X, 부서 Y
WHERE Y.부소코드 = X.관리부서
AND 계약번호 LIKE :계약번호||'%'
AND 관리부서 LIKE :관리부서||'%'
AND 계약일 LIKE NVL(:기준일, TO_CHAR(SYSDATE,'YYYYMMDD')||'%')
AND NVL(계약구분'X') = NVL(:계약구분,'X'); -- NULL 허용 컬럼의 비교
SELECT 계약번호, 관리부서명, 계약일, 고객형태, 계약구분, 고객주소
FROM (SELECT *
FROM 계약
WHERE :계약번호 IS NOT NULL -- 필터링조건
AND 계약번호 = :계약번호
AND 관리부서 LIKE :관리부서||'%'
AND 계약일 LIKE NVL(:기준일, TO_CHAR(SYSDATE,'YYYYMMDD')||'%')
AND NVL(계약구분'X') = NVL(:계약구분,'X')
UNION ALL
SELECT *
FROM 계약
WHERE :계약번호 IS NULL -- 필터링조건
AND 관리부서 = :관리부서
AND 계약일 LIKE NVL(:기준일, TO_CHAR(SYSDATE,'YYYYMMDD')||'%')
AND NVL(계약구분'X') = NVL(:계약구분,'X')
AND ROWNUM <= 300 -- 처리범위가 너무 넓어지는것 방지위한 방호벽
) X, 부서 Y
WHERE Y.부서코드 = X.부서코드
: 다량의 데이터들을 이용해 고도로 가공된 정보를 추출하고자 할 때 엑세스의 효율화 만으로는 원하는 속도를 얻을 수 없는경우(추출데이터가 많을경우) - 집계테이블, 진행관리용 테이블 추가
위의 SQL에서 '현행테이블'에서 마지막으로 집계된 일자를 찾아야 한다. 그러기 위해 아래 쿼리가 먼저 수행되어 있어야 할 것이다.
SELECT /*+ INDEX_DESC(A 집계일자_인덱스) */
집계일자 INTO:시작일
FROM 집계테이블 A
WHERE 집계일자 <= '99991231'
AND ROWNUM = 1;
'집계 테이블'과 '현행 테이블'을 마치 하나의 테이블처럼 만들어 사용 - 뷰로 만들기
CREATE VIEW 집계_뷰(발생일자, 제품코드,수량) AS
SELECT 집계일자, 제품코드, 집계수량
FROM 집계테이블
UNION ALL
SELECT 처리일자, 제품코드, 처리수량
FROM 현행테이블
-- 이뷰를 엑세스 하는 쿼리
SELECT *
FROM 집계_뷰
WHERE 발생일자 BETWEEN '19980101' AND '19980409'
-- 이 엑세스쿼리와 뷰쿼리가 병합되어 아래 SQL이 만들어져 수행됨
SELECT 집계일자, 제품코드, 집계수량
FROM 집계테이블
WHERE 집계일자BETWEEN '19980101' AND '19980409'
UNION ALL
SELECT 처리일자, 제품코드, 처리수량
FROM 현행테이블
WHERE 처리일자BETWEEN '19980101' AND '19980409'
CREATE VIEW 집계_뷰(발생일자1,발생일자2, 제품코드,수량) AS
SELECT 집계일자, '99999999',제품코드, 집계수량
FROM 집계테이블
UNION ALL
SELECT 처리일자, 처리일자,제품코드, 처리수량
FROM 현행테이블
-- 이뷰를 엑세스 하는 쿼리
SELECT *
FROM 집계_뷰
WHERE 발생일자1 BETWEEN '19980101' AND '19980409'
AND 발생일자2 >= '19980408' -- INDEX_DESC를 이용하여 먼저 처리되어 나온일자
-- 이 엑세스쿼리와 뷰쿼리가 병합되어 아래 SQL이 만들어져 수행됨
SELECT 집계일자, 제품코드, 집계수량
FROM 집계테이블
WHERE 집계일자BETWEEN '19980101' AND '19980409'
AMD '99999999' >= '19980408' -- 영원한 참
UNION ALL
SELECT 처리일자, 제품코드, 처리수량
FROM 현행테이블
WHERE 처리일자BETWEEN '19980101' AND '19980409' -- ⓐ
AMD 처리일자 >= '19980408' -- 일정 범위를 가지게 됨 -- ⓑ