编写SQL查询筛选非管理员且ID不在approver表subordinate_id中的用户
修正SQL查询:获取符合条件的普通用户
数据表结构
user表
| id | full_name | is_admin |
|---|---|---|
| 1 | jane | 0 |
| 2 | Helio | 0 |
| 3 | fran | 0 |
| 4 | mila | 0 |
| 5 | admin | 1 |
approver表
| id | subordinate_id | approver_id |
|---|---|---|
| 1 | 1 | 2 |
| 2 | 3 | 4 |
问题分析
你原SQL的问题在于把U.is_admin = 0放在了NOT EXISTS的子查询条件里。对于管理员用户(is_admin=1),子查询的A.subordinate_id = U.id AND U.is_admin = 0永远不成立,NOT EXISTS会返回true,导致管理员被错误包含到结果中。
修正后的SQL语句
写法一(使用NOT EXISTS)
SELECT full_name FROM user AS U WHERE U.is_admin = 0 AND NOT EXISTS( SELECT * FROM approver AS A WHERE A.subordinate_id = U.id );
写法二(使用NOT IN)
SELECT full_name FROM user WHERE is_admin = 0 AND id NOT IN (SELECT subordinate_id FROM approver);
说明
将is_admin = 0移到主查询的WHERE条件中,先过滤掉所有管理员,再筛选出ID不在approver表subordinate_id列中的普通用户,最终结果会是Helio和mila,符合需求。
内容的提问来源于stack exchange,提问作者dev user
相关产品推荐
相关产品推荐

