SELECT a.empno
, a.ename
, a.deptno
FROM emp a
WHERE a.job = 'MANAGER'
AND a.empno IN (SELECT aa.empno
FROM dept_history aa)
SELECT a.empno
, a.ename
, a.deptno
FROM emp a
WHERE a.job = 'MANAGER'
AND EXISTS (SELECT 1
FROM dept_history aa
WHERE aa.empno = a.empno)
원래 목적
select *
from 월별계좌상태 B
where 상태구분코드 <> '01'
and 기준연월 = :base_dt
and exists(select 'X'
from 계좌원장 A
where A.계좌번호 = B.계좌번호
and A.계좌일련번호 = B.계좌일련번호
AND A.개설일자 like :std_ym || '%');
실수
select *
from 월별계좌상태
where 상태구분코드 <> '01'
and 기준연월 = :base_dt
and exists(select 'X'
from 계좌원장 A
where A.계좌번호 = 계좌번호
and A.계좌일련번호 = 계좌일련번호
AND A.개설일자 like :std_ym || '%');
여기서 서브쿼리에 alias를 달지 않은 컬럼은 서브쿼리 내 테이블의 컬럼으로 인식하는 것 같다. 서브쿼리를 사용할 때는 alias를 달아주는 것이 안전할 것 같다.
[인덱스 구성]
월말계좌상태_PK : 계좌번호 + 계좌일련번호 + 기준연월
월말계좌상태_X1 : 기준연월 + 상태구분코드
[SQL]
select *
from 월별계좌상태
where 상태구분코드 <> '01'
and 기준연월 = :base_dt
and 계좌번호 || 계좌일련번호 in (select 계좌번호 || 계좌일련번호 from 계좌원장 where 개설일자 like :std_ym || '%');
해당 SQL을 월말계좌상태_PK 인덱스로 Range Scan 가능하도록 재작성하는 문제였다.
select *
from 월별계좌상태
where 상태구분코드 <> '01'
and 기준연월 = :base_dt
and (계좌번호, 계좌일련번호) in (select A.계좌번호, A.계좌일련번호
from 계좌원장 A
where A.개설일자 like :std_ym || '%');
select *
from 월별계좌상태 B
where 상태구분코드 <> '01'
and 기준연월 = :base_dt
and exists(select 'X'
from 계좌원장 A
where A.계좌번호 = B.계좌번호
and A.계좌일련번호 = B.계좌일련번호
AND A.개설일자 like :std_ym || '%');