5_04 소트가 발생하지 않도록 SQL 작성

Hi·2026년 7월 17일
select empno, job from emp where deptno = 10
union
select empno, jon from emp where deptno = 20;

-> select STATEMENT
	SORT UNIQUE
    	UNION-ALL
        	TABLE~
            TABLE~

PK 컬럼인 empno를 select-list에 포함하므로 두 집합간에는 중복 가능성이 전혀 없다. 따라서 UNION ALL을 사용해야 한다!


distinct를 사용하는 경우도 대부분 exists 서브쿼리로 대체함으로써 소트 연산을 없앨 수 있다.

select distinct 과금연월
from  과금
where 과금연월 <= :yyyymm
and   지역 like :reg || '%'

입력한 과금연월 이전에 발생한 과금 데이터를 모두 스캔하고 그 중 중복 값을 제거해서 결과를 출력하게 된다.

이는 각 월별로 과금이 발생한 적이 있는지 여부만 확인하면 되므로 쿼리를 아래처럼 바꿀 수 있다.

소량의 데이터만을 갖는 연월테이블을 먼저 드라이빙해 과금 테이블을 exists 서브쿼리로 필터링하는 방식이다.

select 연월
from  연월테이블 a
where 연월 <= :yyyymm
and exists (
	select 'x'
    from  과금
    where 과금연월 = a.연월
    and   지역 like :reg || '%'

)

exists 서브쿼리의 가장 큰 특징은, 메인 쿼리로부터 건건이 입력 받은 값에 대한 조건을 만족하는 첫 번째 레코드를 만나는 순간 ture를 반환하고 서브쿼리 수행을 마친다는 점이다.

0개의 댓글