如何在复杂的JOIN中删除重复项

拉贾

我有一个EMPLOYEE表,它也具有内置的层次结构(使用manager列)

员工表

我还有另一个REGION表,它代表经理与地区的关系

区域表

我正在尝试创建一个SQL,该SQL将通过跟踪层次结构链来显示哪些雇员属于哪个区域。

约束/规则:

  • 员工的直属上司可能没有地区-所以我需要继续上链。
  • 我保证4级上链的某人将拥有一个区域。

  • 如果在第4级之前找到区域,则使用下级经理的区域

这是我想出的天真的SQL(但结果重复了-第3条规则失败了)

select distinct e.name, r.region
from employee e 
left outer join employee mgr1 on mgr1.id = e.manager 
left outer join employee mgr2 on mgr2.id = mgr1.manager 
left outer join employee mgr3 on mgr3.id = mgr2.manager 
left outer join employee mgr4 on mgr4.id = mgr3.manager 
left outer join REGION r on 
      (  r.id = mgr1.id 
      or r.id = mgr2.id 
      or r.id = mgr3.id 
      or r.id = mgr4.id  ) 

where e.IS_MANAGER = 'N'; //only interested in users for now; assume a flag

这是ResultSet:

结果

如果已经找到区域,如何有条件地停止左外部联接?

毛里·戴夫(MauriDev)

尝试这个:

select distinct e.name, COALESCE(r1.region, r2.region, r3.region, r4.region, 'No Region') region
from employee e left outer join 
                region r1 on e.manager = r1.id
left outer join employee mgr1 on mgr1.id = e.manager left outer join
                region r2 on mgr1.manager = r2.id
left outer join employee mgr2 on mgr2.id = mgr1.manager left outer join
                region r3 on mgr2.manager = r3.id
left outer join employee mgr3 on mgr3.id = mgr2.manager left outer join
                region r4 on mgr3.manager = r4.id
where e.IS_MANAGER = 'N'; //only interested in users for now; assume a flag

我不确定所有mysql版本都支持COALESCE函数,但是您可以找到一个等效函数(它返回第一个非null参数)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章