2012-09-17 1 views
1

이 쿼리를 (내부처럼 행동 참여) 예상 결과를 포기하지 않을 조인 :오라클의 외부는

select * 
from table_a 
, table_b 
where table_a.id = table_b.id(+) 
    and table_b.name = 'BENEFICIARY' 

나에게 더 레코드를 반환하지 않습니다. table_b에는 name = 'BENEFICIARY'인 레코드가 없습니다. 그러나 외부 조인은 관계없이 table_a의 모든 레코드를 반환해야합니다. 아니?

select * 
from table_a 
, (select * 
    from table_b 
    where table_b.name = 'BENEFICIARY') AS table_b1 
where table_a.id = table_b1.id(+) 

왜 첫 번째 질의는 반환하지 않습니다 기록을 예상대로 아래 쿼리는 table_a에서 레코드를 반환?

+0

왜 쓸모없는 구문입니까? 왜 사용하지 (ANSI 준수!) "left/right join on"구문 ?????? – paulsm4

+2

'(+)'문법 (개인적으로는 ANSI 구문이 장황하기 때문에 개인적으로 좋아하는 문법)을 사용하면 5 행은'table_b.name (+) = 'BENEFICIARY'이어야합니다. –

답변

1

첫 번째 쿼리에서 필터는 조인 후에 결과에 적용됩니다.

select * 
from table_a 
    left join table_b 
    on table_a.id=table_b.id 
    and table_b.name='BENEFICIARY' 
+0

감사합니다. 하지만 ANSI 구문을 사용하면 필터가 조인 후에 적용된다는 사실을 어떻게 알 수 있을까요? – Victor

+1

그렇지 않습니다. 위의 쿼리에는 아무 것도 없으므로 필터링은 조인에 대해 수행됩니다. – podiluska

4

오래된 스타일의 구문 쿼리

select * 
from table_a 
    , table_b 
where table_a.id = table_b.id(+) 
    and table_b.name = 'BENEFICIARY' 

은 ANSI 쿼리 두 경우 모두

select * 
from table_a 
     left outer join table_b on (table_a.id = table_b.id) 
where table_b.name = 'BENEFICIARY' 

동일, 술어 table_b.name = 'BENEFICIARY' 조인 후 적용 시도 외부 조인을 수행하는 목적을 무효로하는 조인의 일부가 아닙니다. ANSI 구문 동안, 당신은 일반적으로

select * 
from table_a 
     left outer join table_b on ( table_a.id = table_b.id 
            and table_b.name = 'BENEFICIARY') 

을 원하는 것이 술어가 조인 작업의 일부 이전 구문을 사용하는 것을 보장하기 위해, 당신은 당신이 ',

select * 
from table_a 
    , table_b 
where table_a.id = table_b.id(+) 
    and table_b.name(+) = 'BENEFICIARY' 

를 필요 이전 구.을 사용하는 경우, 조인 외부에 적용되는 술어가 아니라 조인 조건의 일부가 되려고하는 술어는 (+) 연 j자를 적용해야합니다. 마찬가지로 ANSI 구문을 사용할 때 조인 조건의 일부가 될 술어는 ON 절의 일부 여야합니다.

이 경우 ANSI 구문은 더 이식성이 뛰어날뿐만 아니라 일반적으로 선호됩니다.