我有一个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:
如果已经找到区域,如何有条件地停止左外部联接?
尝试这个:
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] 删除。
我来说两句