SQL*Plus, 데이터 연결 방법 – 저장형 함수의 활용: OR 조인의 주의사항

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 – 대용량 데이터베이스

Leave a Reply