左外部联接未获取左表的所有记录

时间:2019-02-02 12:56:31

标签: hive

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

左手何时像蜂巢一样加入

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就必须来了,但因为在{{ {} {1}}和expr id ... 如何处理NULL,以便将特定的NULL放入我的结果中。我也尝试了合并功能,但是没有运气...尝试输入默认值但仍然没有运气... 让我知道任何细节。提前谢谢...,这些日期都是字符串格式。

1 个答案:

答案 0 :(得分:1)

between条件不允许空值添加左连接被转换到内部。加OR b.emp_id is NULL(加入键)这将允许没有加入记录,无需添加相同条件中使用的所有列between

    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应在返回的数据集。

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