如何解决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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。