subquery와 join의 차이에 대한 질문입니다. 0 2 9,017

by 알오나 [Oracle 기초] [2011.03.04 21:10:49]


오라클 샘플스키마를 가지고 실습을 하다가 문뜩 궁금한 점이 있어서 올립니다. ^^;
관리자를 찾아서 이름을 출력하는 쿼리입니다.

1. joint 이용
select e.last_name
from employees e join employees m
on(e.employee_id = m.manager_id);

2. subquery이용
select last_name
from employees
where employee_id in (select manager_id
from employees);

둘다 똑같은 결과를 도출하고자 사용한 문장들인데요, 결과는 조금 다르게 나옵니다.
2번의 경우 자동으로 중복이 제거되어 결과가 나옵니다.

그래서 왜 subquery를 원래 중복이 제거되는 것인지
그렇다면 어떠한 절차가 있어서 그렇게 되는 것인지 궁금합니다~
아시는 분들 댓글 한줄만 좀 부탁드립니다 ^^;

by camela [2011.03.04 22:00:18]
일반조인과 서브쿼리의 차이점에 대해서 아셔야 되는데요.
일반조인에서 두 테이블은 평등한 관계입니다. 반면 서브쿼리에서는 서브쿼리가 메인 쿼리에 종속되는 관계가 되고요.
평등한 관계에서 두 테이블을 조인하면 아래와 같은 결과가 나옵니다.

1 : 1 = 1
1 : M = M
M : 1 = M
M : M = M*M

종속되는 관계에서는 메인이 변형되지 않게 서브쿼리가 무조건 1 이 되는 형태가 됩니다.

메인 : 서브
1 : 1 = 1
1 : M = 1
M : 1 = M
M : M = M

항상 나오는 결과는 메인 자신이 나오게 되는 것이죠.

서브쿼리는 옵티마이저에 의해 처리될때 from 절로 올라가게 되는데 여기서 뷰머징이 가능하다면 뷰가 없어져서 일반조인과 같은 형태가 되게 됩니다.
다만 semi join , sort unique 가 동작하면서 서브쿼리에서 메인쿼리와의 조인조건을 만족하는 로우를 찾으면 바로 스캔을 멈춤으로서 메인의 집합을 유지하게 되는 것이죠.

얘기가 길어졌는데 1번 조인을 했을때는 그냥 조인이 되는 것이고
2번에서는 서브쿼리의 manager_id 가 여러개 나오더라도 메인의 employee_id 와 같은 manager_id 를 만나는 순간 더이상의 조인을 멈추므로 중복되는 것이 제거된 것처럼 되는 것이죠.

by 알오나 [2011.03.04 23:14:42]
덕분에 이해가 조금 갔습니다. 감사합니다 ^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입