当前位置:  开发笔记 > 后端 > 正文

如何检查一对多映射表中是否存在特定映射

如何解决《如何检查一对多映射表中是否存在特定映射》经验,为你挑选了1个好方法。

我有一个表来维护EMPLOYEE_ID一个或多个ROLE_ID可以分配给员工的s 的映射.这ROLE_IDROLE表的主键.

现在,我试图找出一个特定的员工是否是团队负责人(ROLE_ID = 2).也就是说,本质上,试图找出映射表中是否存在(EMPLOYEE_ID,2)的特定映射组合.

目前,我使用以下查询来实现此目的:

SELECT E.NAME AS `EMPLOYEE_NAME`, 
 EXISTS( SELECT 1 FROM `EMPLOYEE_ROLE` WHERE 
   (`EMPLOYEE_ROLE`.`EMPLOYEE_ID` = `E`.`EMPLOYEE_ID`)
   AND (`EMPLOYEE_ROLE`.`ROLE_ID` = 2)) AS `IS_TEAM_LEADER`
 -- Assume some other column shall be selected from ER table, 
 -- hence necessitating the JOIN on ER
FROM EMPLOYEE E
JOIN EMPLOYEE_ROLE ER ON (ER.EMPLOYEE_ID = E.EMPLOYEE_ID)
GROUP BY E.EMPLOYEE_ID;

虽然这似乎完成了工作,但我正在寻找一种更有效的方法,因为当前形式的子查询似乎是多余的.不确定它是否相关,但可以使用FIND_IN_SET或使用某些功能吗?

任何人都可以建议一个解决方案,因为我对最佳表现方法感兴趣吗?

编辑1:我故意使用了JOIN EMPLOYEE_ROLE意图,也可以从ER表中挑选其他一些列.所以,我正在寻找优化子查询,同时保持连接完好无损.因此,声明"当前形式的当前子查询似乎是多余的".

SQLFiddle:http://sqlfiddle.com/#!9/2aad3/5



1> Shadow..:

使用exists子查询或使用join,但不应在一个查询中同时使用.

我会使用join方法,因为如果需要,很容易获得与角色相关的数据:

SELECT E.NAME AS `EMPLOYEE_NAME`, 
FROM EMPLOYEE E
INNER JOIN EMPLOYEE_ROLE ER ON (ER.EMPLOYEE_ID = E.EMPLOYEE_ID)
WHERE ER.ROLE_ID=2;

如果您需要一个包含指示该员工是否是IS领导者的字段的所有员工的列表,那么请使用left join而不是inner:

SELECT DISTINCT E.NAME AS `EMPLOYEE_NAME`, IF(ER.ROLE_ID IS NULL, 'NOT IS Leader','IS Leader') AS IsISLeader
FROM EMPLOYEE E
LEFT JOIN EMPLOYEE_ROLE ER ON ER.EMPLOYEE_ID = E.EMPLOYEE_ID AND ER.ROLE_ID=2;

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有