1到N个映射列的特殊联接

问题描述

这个问题是AJC Join On 1 to N mapped columns的扩展。

如果EMPLOYEE_DETAILS像这样怎么办:

+---------+-------------+--------------+
| EMP_ID  | AREA_CODE   | SECTOR_CODE  |
+---------+-------------+--------------+
| 1223    | 5001        | 1001         |
| 3224    | (NULL)      | 2001         |
| 3225    | 6001        | (NULL)       |
+---------+-------------+--------------+

然后如何映射如下所示的各个名称

+---------+-------------+--------------+
| EMP_ID  | AREA_NAME   | SECTOR_NAME  |
+---------+-------------+--------------+
| 1223    | AREA 1      | SECTOR 1     |
| 3224    | (NULL)      | SECTOR 2     |
| 3225    | AREA 2      | (NULL)       |
+---------+-------------+--------------+

我曾考虑过像这样union of joins

select e.emp_id,a.LOCATION_NAME as area,s.LOCATION_NAME as sector
from EMPLOYEE_DETAILS e 
join LOCATION_DETAILS a on a.id = e.AREA_CODE 
join LOCATION_DETAILS s on s.id = e.SECTOR_CODE 

union 
select e.emp_id,NULL as sector 
from EMPLOYEE_DETAILS e 
join LOCATION_DETAILS a on a.id = e.AREA_CODE 

union 
select e.emp_id,NULL as area,s.LOCATION_NAME as sector 
from EMPLOYEE_DETAILS e 
join LOCATION_DETAILS s on s.id = e.SECTOR_CODE;

但是这将需要我将其用作内部查询获取预期的结果。

是否有更简洁的方法来做到这一点?

解决方法

为什么left join不两次?

select e.emp_id,a.location_name as area,s.location_name as sector 
from employee_details e 
left join location_details a on a.id = e.area_code 
left join location_details s on s.id = e.sector_code 
,

我可以建议单连接的解决方案,例如:

select 
    e.emp_id,group_concat(if(ld.id = e.area_code,ld.location_name,null)) as area,group_concat(if(ld.id = e.sector_code,null)) as sector 
from EMPLOYEE_DETAILS e 
left join LOCATION_DETAILS ld 
   on (ld.id = e.area_code or ld.id = e.sector_code)
group by e.emp_id;

这里是小提琴:SQLize.online