问题描述
这个问题是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