Oracle:如何筛选仅属于指定单一用户组的用户
解决方案
要筛选仅归属目标用户组(无其他组关联)的用户,核心是统计每个用户关联的组数量,只保留组数量为1且所属组为目标组的用户。以下是正确的查询语句:
SELECT u.USER_PK_ID FROM USERS u JOIN USER_GROUP_USER ugu ON u.USER_PK_ID = ugu.USER_PK_ID WHERE u.ACC_ID = 200640 AND u.DELETED = 'N' GROUP BY u.USER_PK_ID HAVING COUNT(DISTINCT ugu.GROUP_ID) = 1 AND MAX(ugu.GROUP_ID) = 20064212;
逻辑说明
- 从
USERS表筛选出指定ACC_ID且未删除的用户,关联USER_GROUP_USER获取他们的组关联记录。 - 通过
GROUP BY u.USER_PK_ID按用户分组,统计每个用户关联的不同组数量。 HAVING子句过滤:COUNT(DISTINCT ugu.GROUP_ID) = 1:确保用户只关联了一个组MAX(ugu.GROUP_ID) = 20064212:确保这个唯一关联的组就是目标组
之前查询的问题分析
你尝试的第二个查询逻辑存在错误:
SELECT DISTINCT (U.USER_PK_ID) FROM USER_GROUP_USER U JOIN USERS US ON US.USER_PK_ID = U.USER_PK_ID WHERE GROUP_ID = 20064212 AND US.acc_id = 200640 AND US.DELETED = 'N' AND GROUP_ID NOT IN ( SELECT ID FROM USER_GROUP WHERE acc_id = 200640 AND ID != 20064212)
这里的GROUP_ID NOT IN (...)条件是对当前行的GROUP_ID做判断,但当前行已经通过WHERE GROUP_ID = 20064212限定了组ID,所以这个NOT IN条件永远成立,无法排除同时属于其他组的用户——因为这些用户在USER_GROUP_USER里会有其他组的记录,但你的查询只筛选了目标组的行,根本没考虑其他组的关联数据。
内容的提问来源于stack exchange,提问作者user794846
相关产品推荐
相关产品推荐

