Sql 使用Impala连接id字段上的两个表

Sql 使用Impala连接id字段上的两个表,sql,impala,Sql,Impala,我在HDFS中有两个表,我想使用Impala连接它们。一个是员工日志,另一个是人力资源数据 查询: select e.employee_id, e.action from Employee_Logs e where e.employment_status_desc = 'Active' select h.employee_id, h.name from HR_Data h 员工日志: employee_id action 2325255b login 51666164

我在HDFS中有两个表,我想使用Impala连接它们。一个是员工日志,另一个是人力资源数据

查询:

select e.employee_id, e.action from Employee_Logs e where e.employment_status_desc = 'Active'
select h.employee_id, h.name from HR_Data h
员工日志:

employee_id  action
2325255b     login     
51666164     login
51666164v    login
r1211        logoff
r18552421    login
人力资源部数据:

employee_id  name
2325255      Rob    
51666164     Tom
r1211        Tammy
r18552421    Ron
我想加入它们,以便数据如下所示:

employee_id  action  name
2325255b     login   Rob  
51666164     login   Tom
51666164v    login   Tom
r1211        logoff  Tammy
r18552421    login   Ron
如果两个表上的employee_id字段都匹配,我可以进行简单的连接,但是同一个用户可以在其employee id后面有一个“b”或“v”,以指定帐户是否像管理员帐户一样提升。某些用户帐户的id前面有一个“r”,但这两个表都是这样


是否有一种方法可以执行一些where操作并在Employee_Logs表中创建一个新字段,例如从员工id的末尾去掉“v”和“b”,然后加入?或者有更好的方法吗?

可能最安全的方法是多个
加入:

select el.*,
       coalesce(h.name, hv.name, hb.name) as name
from employee_logs el left join
     hr_data h
     on el.employee_id = h.employee_id left join
     hr_data hv
     on el.employee_id = concat(h.employee_id, 'v') left join
     hr_data hb
     on el.employee_id = concat(h.employee_id, 'b');

最安全的方法可能是多个
left
连接:

select el.*,
       coalesce(h.name, hv.name, hb.name) as name
from employee_logs el left join
     hr_data h
     on el.employee_id = h.employee_id left join
     hr_data hv
     on el.employee_id = concat(h.employee_id, 'v') left join
     hr_data hb
     on el.employee_id = concat(h.employee_id, 'b');
您可以如上所述使用子查询,因为您在Employee_日志本身中拥有所需的大多数记录,并引用公共ID来获取每个记录的名称。 在这种情况下,最好使用Or Left join,因为well-Means将提供两个表共用的数据,并保持左表数据为多数

您可以如上所述使用子查询,因为您在Employee_日志本身中拥有所需的大多数记录,并引用公共ID来获取每个记录的名称。 在这种情况下,最好使用Or Left join,因为well-Means将提供两个表共用的数据,并保持左表数据为多数


join
条件中使用
regexp\u replace
,将字符串末尾的
b
v
替换为与员工id匹配的空字符串

select el.employee_id,el.action,hr.name
from employee_logs el
join hr_data hr on hr.employee_id = regexp_replace(el.employee_id,'[bv]$','')

join
条件中使用
regexp\u replace
,将字符串末尾的
b
v
替换为与员工id匹配的空字符串

select el.employee_id,el.action,hr.name
from employee_logs el
join hr_data hr on hr.employee_id = regexp_replace(el.employee_id,'[bv]$','')

我试着在impala中找到trim函数,它显示了idk的某个地方,我找到了trim(),不过我可以检查上面的查询现在是否有效。或者,您可以使用regexp将employee_id替换为字符“我尝试在impala中查找trim函数,它显示了idk的某个地方,我找到了trim(),但您可以检查上述查询现在是否有效。或者,您可以使用regexp将员工ID替换为“”字符