2012-06-09 3 views
1

outer join 쿼리를 시도하는 동안 where 절에서 join 절로 하나의 조건을 변경하면 결과가 변경됩니다. 그게 놀랐지 만 테이블과 쿼리를 아래처럼 간단하게 만들었지 만 이제는 이해할 수 있다고 생각하지만 솔리드 한 설명을 듣고 싶습니다.OUTER JOIN의 조건은 WHERE 조건과 다른 결과를 제공합니다.

create table t0 (id int, b int); 
create table t1 (id int, b int); 
insert into t0 (id, b) values (1, 10), (2, 10); 
insert into t1 (id, b) values (1, 2); 

select t0.id, t0.b 
from t0 
left outer join t1 on 
    t0.id = t1.id 
where 
    t0.b = 10 
    and 
    t1.b = 2 
; 
id | b 
----+---- 
    1 | 10 
(1 row) 

는 지금은 join 절에 where의 조건 중 하나를 이동 :

select t0.id, t0.b 
from t0 
left outer join t1 on 
    t0.id = t1.id 
    and 
    t1.b = 2 
where 
    t0.b = 10 
; 
id | b 
----+---- 
    1 | 10 
    2 | 10 
(2 rows) 

당신이 바로 추론을 작성하는 방법을 알고 계십니까?

답변

6

outer joinon 조건은 join이 성공할 경우에만 결정합니다. 조인에 실패하면 조인 된 열은 null으로 채워집니다.

한편, where 절은 결과 집합에서 전체 행을 필터링합니다.

더 명확하게하려면 결과 집합에 t1.b을 추가하십시오. where 조건으로 t1.b = 2, 당신은 얻을 : t1.b = 2

t0.id t0.b t1.id t1.b 
1  10  1  2 

on 조건으로 ::

t0.id t0.b t1.id t1.b 
1  10  1  2 
2  10  NULL NULL 

where 절은 두 번째 행을 필터링 왜 당신은 볼 수 null = 2은 사실이 아니다.

+1

다른 방법으로 말하자면 외부 조인 된 테이블의 WHERE 조건은 외부 조인을 내부 조인으로 바꿉니다. –

관련 문제