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相同数量的行。
答
有两种常见的问题处理方法。一种是使用多个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
有多个记录,其中field4
或field5
不是每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
你有什么试过?使用'outer join'和'not null'从'tabb'过滤掉你不想查看的记录... – sgeddes
你的编辑已经改变了解决方案 - 现在你需要使用'conditional aggregation'(或额外的'连接')。如果'tabb'中存在多个不是'null'的记录呢? – sgeddes
带有左连接的查询应该完全按照这种方式进行。你得到了什么结果? –