sql - 转换之间的左连接导致行数减少
问题描述
嗨,这是我在 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 行。
我怎样才能在不丢失行的情况下写这个?
解决方案
您可以将过滤条件移至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) 和 (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
);
这些为您提供了可以重新添加的差异。
推荐阅读
- vue.js - 如何在 vue 3 中获取 this 实例?
- mongodb - 如何获取日期范围内的 MongoDB 条目,包括限制?
- android - BitmapFactory 为 ARGB 字节数组返回空位图 (Android)
- selenium - 从谷歌工作表和硒中提取数据以写入网页
- c++ - c++ 将结构推送到向量然后保存到输出文件的问题
- java - 在couchbase中保存为二进制的对象
- php - 尝试从 apache 服务器运行时 PHP intl 不起作用
- sql-server - Powershell Backup-SqlDatabase 备份快照而不是完整备份
- asp.net-core-mvc - 如何显示从视图到控制器的嵌套视图模型
- node.js - 如何在 nodejs 中运行任务,我得到 npm 运行错误