gpt4 book ai didi

hive - 左外连接不获取左表的所有记录

转载 作者:行者123 更新时间:2023-12-05 06:28:12 29 4
gpt4 key购买 nike

我这里有一个场景,有 2 个表,分别是 A 和 B。A表有emp_iddate,B表有2个日期ppl_dexpr_demp_id

left什么时候加入hive like,

select A.emp_id
from A
LEFT JOIN B
ON a.emp_id=b.emp_id
where A.date between B.appl_d and B.expr_d

我看到表 A 中有一名员工而不是表 B 中,当我执行 LEFT JOIN 时,特定的 emp_id 必须出现,但它没有出现,因为在appl_id 和 expr id 的 where 条件都是 NULL...我如何处理 NULL,以便特定的 emp_id 应该进入我的结果。我也尝试了 coalesce 函数,但没有运气......尝试输入默认值但仍然没有运气......让我知道任何细节。提前致谢...这些日期是字符串格式...

最佳答案

between 条件不允许 nulls add left join 转换为 inner。添加OR b.emp_id is NULL(连接键)这将允许不连接的记录,无需为之间<​​中使用的所有列添加相同的条件。

    select *
from A
LEFT JOIN B ON a.emp_id=b.emp_id
LEFT JOIN C on a.emp_id=c.emp_id
where ((A.date between B.appl_d and B.expr_d) OR b.emp_id is NULL)
and
((a.date between c.del_d and c.fin_d) OR c.emp_id is NULL)

这是一个测试:

with 
A as
(
select stack(3,100,'2019-01-13',
200,'2019-01-13',
300,'2019-01-13'
) as (emp_id, date)
),

B as (
select stack(1,100,'2019-12-30','3000-01-01') as (emp_id, appl_d, expr_d)
),

C as
(
select stack(1,100,'2015-06-07', '9999-12-31') as (emp_id, del_d, fin_d)
)

select A.*
from A
LEFT JOIN B ON a.emp_id=b.emp_id
LEFT JOIN C on a.emp_id=c.emp_id
where ((A.date between B.appl_d and B.expr_d) OR b.appl_d is NULL)
and
((a.date between c.del_d and c.fin_d) OR c.emp_id is NULL)

结果:

OK
200 2019-01-13
300 2019-01-13
Time taken: 84.475 seconds, Fetched: 2 row(s)

显然这种方法行不通。 emp_id=100 应该在返回的数据集中。

而且这个问题很有趣,我稍后会继续研究。你们可以使用我的测试来找到可行的解决方案。

关于hive - 左外连接不获取左表的所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54493299/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com