SQL/Presto:由于 NULL,右连接大于原始表
Posted
技术标签:
【中文标题】SQL/Presto:由于 NULL,右连接大于原始表【英文标题】:SQL/Presto: right join bigger than original table due to NULL 【发布时间】:2021-08-10 09:15:09 【问题描述】:我需要用 3 个条件右连接 2 个表,但结果表大于左表或右表。
left_table a 如下:
capacity value group_id level_id tags
100 3 a ab
120 5 a afb lala
122 4 b afg hhh
122 6 c adfg
右表b如下:大于左表
user group_id level_id tags
adsf a ab
af a abf df
sf a afb lala
dsf b afg hhh
sdf c adfg
我想将值和容量值附加到右表 b。我使用了以下查询,但结果表大于正确的表。我注意到这是由于左右表中的标签都为 NULL,但我想知道如何解决这个问题。
select a.capacity, a.value, b.*
from a
right join b
on a.group_id = b._group_id
and a.level_id = b.level_id
and a.tags = b.tags
【问题讨论】:
如果您添加预期结果并设置 dbfiddle 会更容易提供帮助! 【参考方案1】:我注意到这是由于左右表中的标签都为 NULL
不,这不是重复的原因。事实上,NULL
值 fail 比较,所以如果任何一个值是 NULL
,你根本不会得到匹配。也就是说,b
中的行将与来自a
的列的NULL
值一起返回。
如果您希望 NULL
值匹配为相等,那么您需要一个 NULL
-safe 比较 -- 并且 Presto 支持 SQL 标准 is not distinct from
。我也更喜欢left join
而不是right join
:
select a.capacity, a.value, b.*
from b left join
a
on a.group_id = b._group_id and
a.level_id = b.level_id and
a.tags is not distinct from b.tags;
如果您得到重复,那是因为您在 a
中有重复。您可以使用以下方法检查:
select group_id, level_id, tags, count(*)
from a
group by group_id, level_id, tags
having count(*) >= 2;
【讨论】:
以上是关于SQL/Presto:由于 NULL,右连接大于原始表的主要内容,如果未能解决你的问题,请参考以下文章
Presto系列 | 一Presto SQL On Everything
Presto系列 | 一Presto SQL On Everything