2015-01-13 4 views
-3

두 개의 테이블이 있는데 그 중 하나의 테이블에 null 값을 결합하려고합니다. 첫 테이블null로 결합하기

샘플 데이터 (A_TEST) 내 두 번째 테이블 (B_TEST)의

+--+----+ 
|ID|NAME| 
+--+----+ 
| |a | 
|1 |b | 
|1 |c | 
+--+----+ 

샘플 데이터 :

+--+----+ 
|ID|NAME| 
+--+----+ 
|1 |d | 
|2 |e | 
|3 |f | 
+--+----+ 

난 a_test.id = 접합함으로써 결과를 달성하는 데 필요한 b_test.id 그리고 거기에 null 값이 있다면 그것들 역시 가져와야합니다. 그래서, 나는 다음과 같이 출력 얻었다

select a_test.id,a_test.name,b_test.id,b_test.name 
from a_test,b_test 
where (a_test.id = b_test.id 
or a_test.id is null); 

,

+--+----+--+----+ 
|ID|NAME|ID|NAME| 
+--+----+--+----+ 
| |a |1 |d | 
| |a |2 |e | 
| |a |3 |f | 
|1 |b |1 |d | 
|1 |c |1 |d | 
+--+----+--+----+ 

을 다음과 같이 쿼리를 작성하려하지만, ID 1 내 a_test에 있기 때문에 내 예상 결과는 내가 b_test에서 해당 행이 필요하다 출력을

+--+----+--+----+ 
|ID|NAME|ID|NAME| 
+--+----+--+----+ 
| |a |1 |d | 
|1 |b |1 |d | 
|1 |c |1 |d | 
+--+----+--+----+ 

도 봅니다. 외부 조인을 시도했지만 예상 출력이 나에게 줄지 않습니다.

+1

왜 'b_test'의'1 d' 행이'a_test'의'null a' 행에 해당한다고 생각하십니까? –

+1

DBMS는 사용자가 지정한 출력을 원하지 않는다는 것을 어떻게 이해해야합니까? 조건이 하나 더 필요합니다! – jarlh

+0

@defaultlocale - id 1은 a_test 테이블에 있기 때문에 id가 1 인 b_test로부터 레코드를 가져 오기를 기대하고 있습니다. – arunb2w

답변

0

그러나 이상하고 귀하의 요구 사항은 의미없는,이 쿼리는 당신에게 당신의 예상 결과를 제공합니다

select A.*, B.* 
from a_test A 
    join b_test B 
     on A.id = B.id 
union all 
select A.*, B.* 
from a_test A 
    cross join b_test B 
where A.id is null 
    and exists (
     select 1 
     from a_test Ax 
     where Ax.id = B.id 
    ) 
order by 2, 4 
; 

즐기십시오!

0

가입시 a_test.id NULL을 1로 처리해야한다면 COALESCE와 하위 쿼리를 사용하여 대체 값을 찾습니다 (사용자가 직접 계산할 수 있도록 하나 이상의 값을 반환하지 않음). 행) : a_test.id가 null 또는 누락 된 경우

select a_test.id,a_test.name,b_test.id,b_test.name 
from a_test,b_test 
where COALESCE(a_test.id,(select integervalue from sometable)) = b_test.id 
+0

값이 1과 다를 수 있기 때문에 여기서는 상수를 사용할 수 없지만 값은 모든 행에 대해 동일합니다. – arunb2w

+0

@ arunb2w, edited. 그 해결책에 대해 어떻게 생각하세요? – jarlh

0
select a_test.id,a_test.name,b_test.id,b_test.name 
from a_test,b_test 
where a_test.id = b_test.id(+) 

하지만, 당신이 원하는 무엇을 참조하십시오?

+0

오라클은 독점적 인'(+)'연산자를 사용하지 않고 대신 명시 적 (현대) LEFT JOIN을 사용할 것을 권장합니다. –

1

당신의 자신의 질의는 거의 정확합니다. (20 년 전에 유행에 뒤섞인 오류가 발생하기 쉬운 쉼표로 구분 된 조인을 사용해서는 안됩니다). a_test.id가 null 인 경우 일치해야하는 조건 만 누락되었습니다 (b_test.id는 테이블 a_test에 있어야합니다).

select 
    a.id as a_id, 
    a.name as a_name, 
    b.id as b_id, 
    b.name as b_name 
from a_test a 
join b_test b on 
    (a.id = b.id) 
or 
    (a.id is null and b.id in (select id from a_test)); 

SQL fiddle : http://www.sqlfiddle.com/#!4/fae22/2.