SQL组记录但在组中显示不为空

问题描述:

我有两个表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

带有左连接的查询应该完全按照这种方式进行。你得到了什么结果? –

有两种常见的问题处理方法。一种是使用多个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