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

Hive 左外部联接未获取左表的所有记录,hive,Hive,我这里有一个场景,有两个表,分别是A和B。 A表有emp\u id和date,B表有两个日期ppl\u d,expr\u d和emp\u 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\u id必须出现,但不会出现,因为在where条件

我这里有一个场景,有两个表,分别是A和B。 A表有
emp\u id
date
,B表有两个日期
ppl\u d
expr\u d
emp\u 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\u id
必须出现,但不会出现,因为在where条件下
appl\u id
和expr id都有
NULL
。。。 我如何处理空值,以便特定的
emp\u id
应该进入我的结果。我也尝试了合并函数,但没有成功。。。尝试输入默认值,但仍然没有运气。。。
让我知道任何细节。先谢谢你。。。并且这些日期是字符串格式。

介于之间的
条件不允许空值添加左连接被转换为内部连接。Add
或b.emp\u id为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应该在返回的数据集中


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

你似乎已经回答了你自己的问题。如果您不希望在何处应用,则应将其修改为实际需要的条件。例如,添加诸如
或B.appl\u d IS NULL的子句
。我需要应用Where子句来处理NULL,以获取缺少的emp\u id记录。我如何修改它呢?在A.emp_id=B.emp_id上从左连接B中选择A.emp_id,其中B.appl_d和B.expr_d或B.appl_d之间的A.date为null或B.expr_d为null,就像这样???是的,诸如此类。为了避免歧义,您可能应该使用
()
包装和/或,以确保它们正确分组。例如:
(X和Y之间的C)或W或Z
是的,我这样做了。。。你知道,我正在得到我需要的:)。。。非常感谢你的帮助。。。如何将您的评论标记为正确??我根据数据编写的查询略有不同,它获取了我需要的内容。非常感谢您的帮助。我编写了类似select*from的查询(在A.emp_id=B.emp_id上从左连接B选择A.col0,其中(A.date介于B.appl_d和B.expr_d之间)或B.appl_d为NULL或B.expr_d为NULL——以允许NULL(非连接记录))a.emp_id=K.emp_id上的左连接C K=K.emp_id=L.emp_id上的左连接D L,其中a.date介于C.delu D和C.fin_D之间,a.date介于D.allo_D和D.akp_D之间,但我肯定会丢失一些记录。。。因为where条件具有日期间子句。。。如何重写查询,请帮助..使用相同的方法:`LEFT JOIN C K on a.emp_id=K.emp_id LEFT JOIN D L on a.emp_id=L.emp_id,其中((a.date介于C.delu D和C.fin_D之间)或K.emp_id为null)和((a.date介于D.allo_D和D.akp_D之间)或L.emp_id为null)`No,仍然缺少记录,表a、表K和表L中都有特定的员工。。。我可以知道什么是emp_id是空的吗??我在C和D临时表中包含所有空值…@Ma28如果记录未与正确的表联接,则条件或emp_id(来自正确的表)为空允许此类记录(未联接)