2013-01-08 2 views
0

headscratcher에 가입하세요. 내가 그렇게 같은 테이블 반환 함수와 비슷한 무언가를하려고한다면 :포스트 그레스 완전 외부는

with allSizes as (
     select cast('120X60' as character varying) as size 
     union all select '160X600' 
     union all select '1X1' 
     union all select '300X250' 
     union all select '728X90' 
     union all select '88X32' 
     union all select 'PEEL' 
) 
select 
     msd.region, 
     msd.market, 
     s.size, 
     msd.target, 
     msd.actual 
from 
     marketdata('2013-01-05') as msd 
full outer join 
     allSizes as s 
     on s.size = msd.size 
where 
     msd.market = 'Foo, USA'; 

marketdata() 테이블 반환 함수이다, 나는 존재하지 않는 size 컬럼에 해당하는 빈 행을하지 않습니다 marketdata() 기능. 왜 안돼?

답변

3

이 때문이다 :

where 
     msd.market = 'Foo, USA'; 

그것은 full outer join을 생산하고 marketdata()에 존재하지 않는 행을 필터링 쿼리를 변경할 수 있습니다

(그들은 = NULLmsd.market을 가지고 있기 때문에) 로 : 단순히

with allSizes as (
     select cast('120X60' as character varying) as size 
     union all select '160X600' 
     union all select '1X1' 
     union all select '300X250' 
     union all select '728X90' 
     union all select '88X32' 
     union all select 'PEEL' 
) 
select 
     msd.region, 
     msd.market, 
     s.size, 
     msd.target, 
     msd.actual 
from 
     (select marketdata('2013-01-05') 
     where market = 'Foo, USA') as msd 
full outer join 
     allSizes as s 
     on s.size = msd.size; 

또는

를 다시 작성
where 
     msd.market = 'Foo, USA' OR msd.market IS NULL; 

marketdata()msd.market IS NULL이 아닌 행을 반환합니다.

+0

하아! 명백한 지금. 나는 전체 결합을 거의 사용할 필요가 없기 때문에 그것을 과소 평가했다. –

+0

@JeremyHolovacs : "외부"테이블의 열이 where 절의 일부인 경우 "일반"왼쪽 또는 오른쪽 외부 조인에 대해서도 마찬가지입니다. –

+0

@a_horse_with_no_name, 네, 그게 내가 지금 분명하다고 말한 이유입니다. 한 번에 한 사람이 뇌의 장애를 일으킬 수 있습니다. :) –