我需要在employee_id上将tableA连接到tableB,并且表A中的cal_date需要在表B的日期开始和结束日期之间。我运行下面的查询并收到以下错误消息,请你帮我纠正和查询。谢谢你的帮助!
在JOIN' date_start' 中遇到左右别名。
select a.*, b.skill_group
from tableA a
left join tableB b
on a.employee_id= b.employee_id
and a.cal_date >= b.date_start
and a.cal_date <= b.date_end
答案 0 :(得分:3)
RTFM - 引用LanguageManual Joins
Hive不支持非平等条件的连接条件 因为很难表达map / reduce这样的条件 工作
您可能会尝试将BETWEEN过滤器移动到WHERE子句,从而导致糟糕的部分笛卡尔连接,然后进行后处理清理。呸。根据“技能组”表的实际基数,它可以快速工作 - 或者整天工作。
答案 1 :(得分:0)
如果情况允许,请在两个查询中进行操作。
首先具有完全联接,可以具有范围;然后使用外部联接,在所有列上都匹配,但要包括where子句,其中其中一个字段为null。
例如:
create table tableC as
select a.*, b.skill_group
from tableA a
, tableB b
where a.employee_id= b.employee_id
and a.cal_date >= b.date_start
and a.cal_date <= b.date_end;
with c as (select * from TableC)
insert into tableC
select a.*, cast(null as string) as skill_group
from tableA a
left join c
on (a.employee_id= c.employee_id
and a.cal_date = c.cal_date)
where c.employee_id is null ;
答案 2 :(得分:0)
MarkWusinich有一个很好的解决方案,但有一个重大问题。如果表a在日期范围内两次具有雇员ID,则表c还将具有两次雇员ID(如果b是唯一的,如果不是唯一的话),则在联接后创建4条记录。因此,如果A在employee_ID上不是唯一的,则必须使用group by。更正如下:
with C as
(select a.employee_id, b.skill_group
from tableA a
, tableB b
where a.employee_id= b.employee_id
and a.cal_date >= b.date_start
and a.cal_date <= b.date_end
group by a.employee_id, b.skill_group
) C
select a.*, c.skill_group
from tableA a
left join c
on a.employee_id = c.employee_id
and a.cal_date = c.cal_date;
请注意:如果B有意在(employee_id,skill_group)上没有区别,那么我上面的查询也必须进行修改以适当地反映出来。