Hive外连接和非平等条件

时间:2016-11-04 15:29:48

标签: sql hive

鉴于table1:

id  event_date  bar
1   2016-01-01 100

并且表2:

  id   begin_date end_date   foo   bar
  1    2016-01-01 2016-12-31  1    100
  1    2017-01-01 2017-01-01  2    NULL

我想:

    ...
table1 
left join table2 
on table1.id = table2.id
    and table2.event_date between table1.begin_date and table1.end_date

通常,我只是做一个外连接:

OR event_date is null

但是Hive不允许我们这样做。所以我尝试将日期比较下移到where子句,然后添加... table1 left join table2 on table1.id = table2.id where (table2.event_date is null OR table2.event_date between table1.start_date and table1.end_date)

{{1}}

但它最终像内部联接一样工作,所以我没有得到2017年的回归。我做错了什么,还是有另一种方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

你没有得到2017年的行,因为你将它放在where子句中 - 该行不会在null中获得event_date且日期条件也是假的。< / p>

按照您的示例,如果您希望bar为空 - 您需要将条件移至select子句:

select t1.id, begin_date, end_date, foo, 
   if(table2.event_date is not null and 
      table2.event_date between table1.start_date and table1.end_date, bar, null) from 
table1 left join table2
on table1.id = table2.id;