Sql 指望HAVING子句的麻烦
有人能帮我解答这个问题吗 我只需要选择所有用户,每个人都有dt_user_login=null, 如果组中有人有dt_用户登录!=空,我不需要任何人。 我的查询返回ORA-00937:不是单个组函数:Sql 指望HAVING子句的麻烦,sql,oracle,Sql,Oracle,有人能帮我解答这个问题吗 我只需要选择所有用户,每个人都有dt_user_login=null, 如果组中有人有dt_用户登录!=空,我不需要任何人。 我的查询返回ORA-00937:不是单个组函数: SELECT ID_USER FROM USERS WHERE ID_USER_GROUP = '003008' HAVING COUNT(ID_USER) = ( SELECT COUNT(ID_USER) FROM USERS WHERE ID_USER_
SELECT ID_USER
FROM USERS
WHERE ID_USER_GROUP = '003008'
HAVING COUNT(ID_USER) =
( SELECT COUNT(ID_USER) FROM USERS WHERE ID_USER_GROUP = '003008' AND DT_USER_LOGIN IS NOT NULL )
@编辑:
如果在此组中我有5个用户,并且5个用户中有1个的dt_user_login=null,则我的查询将不会返回任何人(0个用户)
如果在此组中我有5个用户,并且所有5个用户的dt_user_login=null,则我的查询需要返回所有5个用户,明白吗?您可以搜索没有一行dt_user_login不为null的组
SELECT U1.ID_USER
FROM USERS U1
WHERE NOT EXISTS (SELECT 1 FROM USERS U2
WHERE U2.DT_USER_LOGIN IS NOT NULL
AND U1.ID_USER_GROUP = U2.ID_USER_GROUP
)
AND U1.ID_USER_GROUP = '003008'
下面是一个使用分析函数计算非空dt_用户登录数的替代解决方案:
select id_user
from (select id_user,
id_user_group,
count(case when dt_user_login is not null then 1 end) over (partition by id_user_group) not_null_dt_user_login_count
from users)
where id_user_group = '003008'
and not_null_dt_user_login_count = 0;
您应该测试所有解决方案,看看哪一个最适合您的数据。有些可能比其他更有效。用一个例子编辑了我的问题,如果组中的某个用户的dt=null,我不想返回任何人。在我的查询中,只有当组中的所有用户都为null时,查询才会返回所有这些用户。这就是你要找的,不是吗?不幸的是,返回了ORA-00904:“id\U user\U group”:第行的标识符无效,其中id\U user\U group='003008''。哎呀,我在内部查询中漏掉了那个列。已经更新了我的答案中的查询,所以现在应该可以正常工作了。