SQL查询问题:如何找出无CLERK下属的Table A员工信息
解决SQL查询:筛选无CLERK下属的员工信息
需求说明
查询Table A中所有**下属(EMP_REPORTEE)不含"CLERK"**的员工信息:
- Table A:包含EMP_NO(主键)、EMP_NAME字段
- Table B:包含EMP_NO(非唯一)、EMP_REPORTEE字段,记录员工的下属岗位
示例数据
Table A
EMP_NO EMP_NAME 100 VICTOR 200 JOHN 300 AASIF
Table B
EMP_NO EMP_REPORTEE 100 MANAGER 100 OPERATOR 200 OPERATOR 200 CLERK 300 MANAGER 300 CLERK
预期结果
仅返回EMP_NO为100的员工:
EMP_NO EMP_NAME 100 VICTOR
原查询问题分析
你编写的查询语句:
SELECT EMP_NO, EMP_NAME FROM TABLE_A, TABLE_B WHERE A.EMP_NO = B.EMP_NO AND B.EMP_REPORTEE != 'CLERK'
问题在于:只要员工有一条非CLERK的下属记录,就会被筛选出来。比如EMP_NO=200的员工,虽然有CLERK下属,但同时有OPERATOR下属,会满足B.EMP_REPORTEE != 'CLERK'的条件,导致错误出现在结果中。
正确查询写法
方法1:使用NOT EXISTS(推荐,逻辑直观)
SELECT a.EMP_NO, a.EMP_NAME FROM TABLE_A a WHERE NOT EXISTS ( SELECT 1 FROM TABLE_B b WHERE b.EMP_NO = a.EMP_NO AND b.EMP_REPORTEE = 'CLERK' )
逻辑:直接判断该员工不存在任何CLERK下属的记录,符合需求。
方法2:使用GROUP BY + HAVING
SELECT a.EMP_NO, a.EMP_NAME FROM TABLE_A a JOIN TABLE_B b ON a.EMP_NO = b.EMP_NO GROUP BY a.EMP_NO, a.EMP_NAME HAVING SUM(CASE WHEN b.EMP_REPORTEE = 'CLERK' THEN 1 ELSE 0 END) = 0
逻辑:统计员工的CLERK下属数量,数量为0则说明没有CLERK下属。
方法3:使用LEFT JOIN + IS NULL
SELECT a.EMP_NO, a.EMP_NAME FROM TABLE_A a LEFT JOIN TABLE_B b ON a.EMP_NO = b.EMP_NO AND b.EMP_REPORTEE = 'CLERK' WHERE b.EMP_NO IS NULL
逻辑:通过左连接匹配员工的CLERK下属,没有匹配到(即b.EMP_NO为NULL)的员工,就是没有CLERK下属的员工。
内容的提问来源于stack exchange,提问作者Swami Viswanadh
相关产品推荐
相关产品推荐

