配置单元中日期范围上的sql联接表

o2g1uqev  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(340)

我需要在employee\u id上将tablea连接到tableb,并且表a中的calu日期必须介于表b中的date start和date end之间。我跑了下面的查询,收到下面的错误信息,请您帮我改正和查询。谢谢你的帮助!
在join'date\u 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
4dbbbstv

4dbbbstv1#

马克乌西尼奇有一个很好的解决方案,但有一个主要问题。如果表a在日期范围内有两次雇员id,表c也会有两次雇员id(如果b是唯一的,如果不是更多),在联接后创建4条记录。因此,如果在员工id上不是唯一的,则需要一个分组依据。更正如下:

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故意不区分(雇员id,技能组),那么我上面的查询也必须修改以适当反映这一点。

ruoxqz4g

ruoxqz4g2#

如果您的情况允许,可以分两次查询。
先用全连接,可以有范围;然后使用一个外部连接,匹配所有列,但包含一个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 ;
jmp7cifd

jmp7cifd3#

rtfm-引用语言手动连接
配置单元不支持非相等条件的联接条件,因为很难将此类条件表示为map/reduce作业。
您可能会尝试将between筛选器移动到where子句,从而导致糟糕的部分笛卡尔连接,然后进行后期处理清理。讨厌。根据“技能组”表的实际基数,它可能工作得很快,或者需要一整天的时间。

相关问题