我有一个表来维护EMPLOYEE_ID
一个或多个ROLE_ID
可以分配给员工的s 的映射.这ROLE_ID
是ROLE
表的主键.
现在,我试图找出一个特定的员工是否是团队负责人(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
使用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;