2012-07-17 1 views
1

where 절이 아닌 outer join 절의 필터를 사용하여 테이블을 필터링하려고합니다. 내가 그렇게하려고 할 때 나는 예상치 못한 결과를 얻고있다. 마치 필터를 전혀 적용하지 않은 것처럼 전체 테이블이 반환됩니다.where 절 대신 outer join에 필터 조건을 추가 할 때의 차이점은 무엇입니까?

이 예제를 실행하면 마지막 두 쿼리에 대해 다른 결과가 나타납니다. 나는 그들이 같은 결과를 기대하지만, 사실이 아니다. 여기서 무슨 일이 일어나고있는거야?

declare @a table 
(
    id int 
    ,content varchar(100) 
) 
declare @b table 
(
    id int 
    ,content varchar(100) 
) 

insert into @a (id,content) values (1,'Apple') 
insert into @a (id,content) values (2,'Banana') 
insert into @a (id,content) values (3,'Orange') 
insert into @b (id,content) values (1,'Juice') 
insert into @b (id,content) values (2,'Peel') 
insert into @b (id,content) values (3,'Julius') 

--basic outer join 
select * from @a a left join @b b on a.id=b.id 

--outer join with where clause filter 
select * from @a a left join @b b on a.id=b.id where a.id=1 

--outer join with join clause filter 
select * from @a a left join @b b on a.id=1 and a.id=b.id 
+1

여기 좀 보시라. http://stackoverflow.com/questions/10297231/where-clause-vs-on-when-using-join/10297312#10297312 – StuartLC

답변

4

외부 조인은 조인 된 테이블의 행에 대해 NULL을 반환 할 수 있지만 결과가 반환되기 전에 where 절을 일치시켜야합니다.

select * from @a a left join @b b on a.id=b.id where a.id=1 

는 " aid=1에서 나에게 모든 행을주고 b a.id=b.id의 모든 행이이 상관 관계를하려고합니다. 반면에
select * from @a a left join @b b on a.id=1 and a.id=b.id 

이하는 번역"로 번역 나에게 모든 행을 부여 a에서 a.id=1 인 경우 b의 행과 상관 시키십시오. a.id=b.id (그렇지 않으면 a의 데이터 만 제공).

ON 절에 조건을 추가하고 WHERE 절에 조건을 추가하는 것이 내부 동의 인 경우를 대비하십시오.

+0

이 부분을 잘 이해하면 조인 절의 필터 테이블 중 하나에서 결과 집합을 제한하지만 둘 다에서 제한하지 않습니다. where 절은 두 가지를 모두 필터링합니다. – FistOfFury

+1

@FistOfFury 맞습니다. –