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

不,这不是重复的原因。事实上,NULLfail 比较,所以如果任何一个值是 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

presto,dremio,spark-sql与ranger的整合记录

从字段 sql/presto 中提取子字符串

SQL(Presto):当 x 的总和等于某个阈值时返回日期