You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:00:59