2016-03-03 55 views
-1

我有兩個表TabA,TabB 我有興趣將它們連接在一起,以便結果與TabA具有相同的記錄數量,並且它只連接來自TabB的非NULL值。話雖這麼說SQL組記錄但在組中顯示不爲空

TabA 
field1 field2 
1  valone 
1  valtwo 
2  valone 
3  valone 

TabB 
field3 field4, field5 
1  NULL test3 
1  test1 NULL 
2  test2 NULL 

,我想要得到的結果是:

field1 field2 field4 field5 
1  valone test1 test3 
1  valtwo test1 test3 
2  valone test2 NULL 
3  valone NULL NULL 

我迄今

SELECT TabA.field1, TabA.field2, TabA.field4 
FROM TabA 
LEFT JOIN TabB ON TabA.field1 = TabB.field3 

但是這並沒有考慮到我想要的事實返回與TabA相同數量的行。

+0

你有什麼試過?使用'outer join'和'not null'從'tabb'過濾掉你不想查看的記錄... – sgeddes

+0

你的編輯已經改變了解決方案 - 現在你需要使用'conditional aggregation'(或額外的'連接')。如果'tabb'中存在多個不是'null'的記錄呢? – sgeddes

+0

帶有左連接的查詢應該完全按照這種方式進行。你得到了什麼結果? –

回答

1

有兩種常見的問題處理方法。一種是使用多個outer joins

select a.field1, a.field2, b.field4, b2.field5 
from TabA a 
    left join TabB b on a.field1 = b.field3 and b.field4 is not null 
    left join TabB b2 on a.field1 = b2.field3 and b2.field5 is not null 

然而,這可能會返回多個結果,如果TabB有多個記錄,其中field4field5不是每field3空。


要消除重複項,另一個選項是使用conditional aggregation

select a.field1, a.field2, 
     max(case when b.field4 is not null then b.field4 end) field4, 
     max(case when b.field5 is not null then b.field5 end) field5 
from TabA a 
    left join TabB b on a.field1 = b.field3 
group by a.field1, a.field2 

如果多個記錄存在,這隻會在TabA返回每條記錄單行,但field4和/或field5可能不是你想要的。取決於您在此期望的結果。

如果重複不是問題,那麼這兩個解決方案應該產生您想要的結果。

+0

中看到很多缺失值,您說得對,我對問題的初始描述已經過於簡化了,這就是爲什麼我必須更新它。 – sgp667