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

如何根据关联表条件查询符合要求的用户名(SQL)

问题解决:符合条件的用户查询

数据表结构

user表

idfull_nameis_adminis_active
1Alan01
2Carl01
3Any01
4Jane01
5Marry01
6Pedri01
7admin11
8Mota00

approver表

(subordinate_id、leader_id和main_leader_id为关联user表id列的外键)

idsubordinate_idleader_idmain_leader_idis_active
11230
24561
31240

查询需求

需获取满足以下条件的用户名:

  • 非管理员(user表is_admin=0)且状态活跃(user表is_active=1);
  • 若该用户在approver表的subordinate_id列存在记录,仅保留approver表is_active=0的用户。

原查询问题

原查询语句:

SELECT 
      full_name 
    FROM user AS U 
    LEFT JOIN approver AS A 
    ON U.id = A.subordinate_id 
    WHERE 
      A.id is null 
    AND 
      U.is_admin = 0 
    AND 
      U.is_active = 1

该语句仅筛选出未在approver表中存在记录的用户,漏掉了在approver表中有记录但is_active=0的用户(比如Alan)。

正确SQL查询

方式一:LEFT JOIN + 条件过滤

SELECT DISTINCT U.full_name
FROM user AS U
LEFT JOIN approver AS A ON U.id = A.subordinate_id
WHERE 
    U.is_admin = 0 
    AND U.is_active = 1
    AND (A.id IS NULL OR A.is_active = 0)
  • 用LEFT JOIN保留所有符合用户基础条件的记录;
  • 通过(A.id IS NULL OR A.is_active = 0)筛选:要么无审批记录,要么审批记录非活跃;
  • DISTINCT去重,避免同一用户多条审批记录导致重复结果。

方式二:子查询筛选

SELECT full_name
FROM user
WHERE 
    is_admin = 0 
    AND is_active = 1
    AND (
        id NOT IN (SELECT DISTINCT subordinate_id FROM approver)
        OR id IN (SELECT DISTINCT subordinate_id FROM approver WHERE is_active = 0)
    )
  • 子查询分别获取所有有审批记录的用户,以及审批记录非活跃的用户;
  • 条件逻辑:要么不在审批记录中,要么在审批记录且状态为0。

验证结果

执行上述查询后,得到预期结果:

Alan
Carl
Any
Marry
Pedri

内容的提问来源于stack exchange,提问作者Louis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:20:59