2015-01-13 17 views
-3

我有兩個表,我想用它們中的空值連接它們。我的第一表的加入null

樣本數據(A_TEST):

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

我的第二表(B_TEST)的樣本數據:

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

我需要通過加入a_test.id =達到的效果b_test.id,如果它有空值,我也需要獲取它們。於是,我就寫如下的查詢,

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表中,我期望從b_test中獲得記錄,這個記錄也有id爲1 – 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和子查詢來查找替換值(要自行解決,請確保它不會返回多個值行):

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,該值將相同。你對這個解決方案有什麼看法? – 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(+) 

但是,你想要什麼看,當a_test.id爲空或丟失?

+0

Oracle建議停止使用專有的「(+)」運算符,並使用顯式(現代)的'LEFT JOIN'代替。 –

1

您自己的查詢幾乎是正確的(儘管您不應該使用大約20年前過時的錯誤傾向逗號分隔連接)。如果a_test.id爲空(即: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小提琴:http://www.sqlfiddle.com/#!4/fae22/2