2013-05-06 1 views
1

테이블 (tbla 및 tblb) 각 열 (id) :oracle sql 전체 조인 테이블에없는

select *에서 tbla; 왜 ID 2 항목이

select a.id, b.id 
from tbla a 
full outer join tblb b on b.id = a.id; 

ID ID1 
-------- 
1 
3 3 
5#A 
    2 

...하지만 항목이 tbla.id

select a.id, b.id 
from tbla a 
full outer join tblb b on b.id = a.id 
where a.id not like '%#%'; 

ID ID1 
-------- 
1 
3 3 

에 #의 -sign를 포함하지 않고 :

ID 
--- 
1 
3 
5#A 

select * from tblb; 

ID 
--- 
2 
3 

는 지금은 전체가 참여 필요 tblb가 누락 되었습니까?

답변

3

full outer join을 수행 할 때 양쪽의 열이 NULL 값이 될 수 있습니다.

이 명시 적으로 NULL을 확인 :..

select a.id, b.id 
from tbla a 
full outer join tblb b on b.id = a.id 
where a.id not like '%#%' or a.id is null; 

는 (원래 내가 제안했던 on 절에 논리를 이동 아아가의 full outer join이 두 테이블에서 레코드를 유지 레코드가 조건에 일치하지 않더라도 때, 조건을 on 절로 이동해도 아무 것도 수정되지 않습니다.)

+0

감사합니다. 두 번째 선택이 정상적으로 작동합니다. 첫번째 것은 아직도 5 # A를 포함한다 – Marc

+0

gordon는 날을 다시 저장한다! 고맙습니다! –

0

외부 조인을 수행 할 때 from 절에서 필터링을 수행해야합니다. where 절에서이 작업을 수행하면 실제로 조인이 내부 조인이됩니다.

그래서이 변경 :

full outer join tblb b on b.id = a.id 
where a.id not like '%#%' 

full outer join tblb b on b.id = a.id 
and a.id not like '%#%' 
0

에 당신은 전체가 참여하고 있지만, where 절에 a.id 지정하여, 당신은 당신의 결과가 이후에 설정 필터링합니다.

는 조인 조건에 절을 이동할 수 있습니다, 당신이 원하는 것을 달성하기

select a.id, b.id 
from tbla a 
full outer join tblb b 
    on b.id = a.id 
    and a.id not like '%#%'; 

또는 당신은 NVL 사용할 수 있습니다 명시 적으로

select a.id, b.id 
from tbla a 
full outer join tblb b on b.id = a.id 
where nvl(a.id, 'n/a') not like '%#%'; 

또는 a.id에 대한 NULL 값을 허용 :

select a.id, b.id 
from tbla a 
full outer join tblb b on b.id = a.id 
where (a.id is null or a.id not like '%#%');