SQL*Plus, 데이터 연결 방법 – 저장형 함수의 활용: OR 조인의 주의사항
/** * 수정전 - 잘못된 배타적 관계의 조인 */ SELECT x.계좌번호 , x.개설일자 , nvl(y.성명,z.법인명) , … FROM 계좌 x, 개인 y, 법인 z WHERE ( x.구분 = '1' AND x.ID = y.ID OR x.구분 = '2' AND x.ID = z.ID ) AND x.개설일 LIKE :in_date||'%';
/** * 수정전 - 잘못된 배타적 관계의 조인 */ SELECT x.계좌번호 , x.개설일자 , nvl(y.성명,z.법인명) , … FROM 계좌 x, 개인 y, 법인 z WHERE x.ID IN (y.ID, z.ID ) AND x.개설일 LIKE :in_date||'%';
- 이 Join들은 다음과 같이 UNION으로 분리되어 처리된다.
- UNION으로 분리된 각 Select 문은 3개의 테이블이 Join되지만 연결고리는 하나만 존재한다.
- 조인 결과는 카테시안 곱 만큼의 결과가 나타난다.
/** * 수정전 - 잘못된 배타적 관계의 조인 */ SELECT x.계좌번호 , x.개설일자 , nvl(y.성명,z.법인명) , … FROM 계좌 x, 개인 y, 법인 z WHERE x.구분 = '1' AND x.ID = y.ID AND x.개설일 LIKE :in_date||'%' UNION SELECT x.계좌번호 , x.개설일자 , nvl(y.성명,z.법인명) , … FROM 계좌 x, 개인 y, 법인 z WHERE x.구분 = '2' AND x.ID = z.ID AND x.개설일 LIKE :in_date||'%';
/** * 수정후 - 잘못된 배타적 관계의 조인 */ SELECT x.계좌번호 , x.개설일자 , nvl(y.성명,z.법인명) , … FROM 계좌 x, 개인 y, 법인 z WHERE y.ID(+) = decode(x.구분, '1', x.ID) AND z.ID(+) = decode(x.구분, '2', x.ID) AND x.개설일자 LIKE :in_date||'%';
- 항상 3 테이블의 Join이 수행
- 비교값이 NULL인 경우에도 Join은 수행됨
원문 출처
Encore – 대용량 데이터베이스