首页 > 解决方案 > 转换之间的左连接导致行数减少

问题描述

嗨,这是我在 impala 中的查询。我需要将其转换为蜂巢

Select count(*)
FROM  ud_planning.WIM_MF2_Temp as MF
    LEFT JOIN 
          ud_planning.WIM_PDA_Temp as PDA
            on  PDA.materialnum = MF. materialnum 
            and   MF.loaddate between PDA.FromDate  and PDA.Todate 

结果:61664421 行。

我的蜂巢版本:

Select count(*)
FROM  ud_planning.WIM_MF2_Temp as MF
    LEFT JOIN 
          ud_planning.WIM_PDA_Temp as PDA
            on  PDA.materialnum = MF. materialnum 
where  (MF.loaddate >= PDA.FromDate   and MF.loaddate <= PDA.Todate)
  or PDA.materialnum is  null

结果:59184964 行。

我怎样才能在不丢失行的情况下写这个?

标签: sqlhiveimpala

解决方案


您可以将过滤条件移至where子句:

Select count(*)
from ud_planning.WIM_MF2_Temp MF left join
     ud_planning.WIM_PDA_Temp PDA
     on PDA.materialnum = MF.materialnum and
        MF.loaddate >= PDA.FromDate and
        MF.loaddate <= PDA.Todate;

on哦,那是您的第一个查询——我认为由于子句中的不等式,它在 Hive 中不起作用。

您尝试相加的两个表之间存在三种可能的情况:

  1. 材料匹配,时间框架匹配。
  2. 材料匹配,有时间框架,但没有匹配。
  3. 没有材料匹配。

您的第二个查询仅得到 (1) 和 (3)。第二个是相当棘手的,因为没有on条款的灵活性的限制。您可以使用以下方法计算它:

select count(*)
from (select count(*)
      from ud_planning.WIM_MF2_Temp MF join
           ud_planning.WIM_PDA_Temp PDA
           on PDA.materialnum = MF.materialnum
      group by MF.materialnum
      having sum(case when MF.loaddate >= PDA.FromDate and MF.loaddate <= PDA.Todate then 1 else 0 end) = 0
     ) MF;

尽管我认为这在 Hive 中不起作用,但另一种表述是:

select count(*)
from ud_planning.WIM_MF2_Temp MF
where not exists (select 1
                  from ud_planning.WIM_PDA_Temp PDA
                  where PDA.materialnum = MF.materialnum and
                        MF.loaddate >= PDA.FromDate and MF.loaddate <= PDA.Todate
                 );

这些为您提供了可以重新添加的差异。


推荐阅读