2013-07-07 4 views
3

OUTER JOIN에서 다음 SQL (혼돈 스러울 수도 있음)에서 혼란 스럽습니다.
저는 작은 테이블 empdeptno을 가지고 있습니다. 즉, 직원 및 부서에 대한 레코드가 있습니다. 그들의 관계는 분명히 1-N입니다 (그러나 이것은 부적절합니다).
외부 조인을 사용하여 거기서 근무하는 직원이없는 부서를 찾으려고합니다. 그래서 올바른 해결책은 OUTER JOIN이라고 생각했습니다. 다음 작업을 수행 할 경우
:왜 왼쪽 외부 조인이 잘못된 결과를 생성합니까?

d_deptno e_deptno 
10,   10 
10,   10 
10,   10 
20,   20 
20,   20 
20,   20 
20,   20 
20,   20 
30,   30 
30,   30 
30,   30 
30,   30 
30,   30 
30,   30 
40,   null  

이 좋아, 그래서 내가 필요한 것은 그래서는 다음과 같이 내 쿼리를 수정할 필요가 맨 마지막 줄입니다 생각 :

select d.deptno as d_deptno, e.deptno as e_deptno 
from dept d left outer join emp e 
on d.deptno = e.deptno;  

내가 얻을

select d.deptno as d_deptno, e.deptno as e_deptno 
from dept d left outer join emp e 
on d.deptno = e.deptno and e.deptno is null; 

즉 나는 and e.deptno is null을 추가했다. 어떤 이유로 나는 e_deptno is null 쿼리를 구문 분석 할 수 없습니다 (이유는 무엇입니까?)
하지만 결과는 다음과 같습니다!

d_deptno e_deptno 
10,  null 
20,  null 
30,  null 
40,  null 

왜 이러한 결과가 나타 납니까? OUTER JOIN 님의 오해는 무엇입니까?

+0

어디 조건 e.deptno는 또한 null' – chetan

+0

입니다 절은'당신이 별칭을 사용할 수없는 곳에서 두 번째 조건을 넣어해야합니다. – chetan

+0

@chetan : 그래서'join on and or'을 할 수 없습니까? – Jim

답변

3
조건 e.deptno is nullwhere 절에 있어야

:

select d.deptno as d_deptno, e.deptno as e_deptno 
from dept d left outer join emp e 
on d.deptno = e.deptno 
where e.deptno is null 

on 절은 다른 하나 개의 테이블에서 행을 가입하는 조건으로 규정 된 조건을 사용하기 때문입니다 - 그것은 것에만 연결하므로 deptnoemp 레코드로, 그리고 dept 레코드와 일치하는 동시에 deptno이 기록됩니다.

이러한 조건은 상호 배타적이므로 쿼리가 emp 레코드에 성공적으로 연결되지 않으므로 외부 조인은 값에 대해 null이 반환되도록합니다.

where 절은 조건에 가입하면인가 - 그래서 where 절에 is null 이동 조건이 일치하는 레코드만을 empdept 레코드가 선택되는 것을 보장한다. 합니다 (onwhere 및 그룹이 적용된 후) e_deptno은 select 절에 정의되어 있기 때문에

e_deptno is nullon 절 또는 where 절 중 하나에서이 쿼리에서는 유효하지 않습니다 - 아마 유효 할 것 그러나 having 절 (in MySQL)에서.

+0

내 버전의 'on ... and'은 무엇을합니까? 또한'e_deptno'가 왜 쿼리의 일부로 받아 들여지지 않는지 알기 원하십니까? – Jim

+0

@ 짐 - 업데이트 된 답변보기. –

+0

+1. '그래서 그것은 deptno가 null 인 emp 레코드들과 연결될 것이고 deptno와 일치하는 deptno와 만 연결될 것입니다'당신은'eptptno'와 일치하는'emp '로부터 ** ** deptno '무효'로? – Jim

관련 문제