oracle数据库查询报错:ORA-01427: 单行子查询返回多个行

在查询某个月的登录用户数时有时会出现错误 ORA-01427: 单行子查询返回多个行,sql如下:
select NVL((select count(distinct user_id) as actnum
from (select user_id, to_char(login_date, 'YYYY-MM') riqi
from log_login where login_date between
to_date('2018-02-01', 'YYYY-MM-DD hh24:mi:ss') and
to_date('2018-02-28', 'YYYY-MM-DD hh24:mi:ss') and
user_oth_id is null
group by to_char(login_date, 'YYYY-MM'), user_id) t
group by t.riqi), 0) from dual
请问有谁指导报错原因吗,哪个子查询可能会返回多个行?

nvl是一个标量函数,在你的SQL语句中,nvl第一个参数是一个子查询。而该子查询是按日期统计用户登录的次数(group by t.riqi),如果查询范围在一天之内,因为t.riqi就是一个值,子查询的结果集中只有一条记录,是没有问题的;而如果查询的日期范围超出1天,且有用户在不同的日期有登录,那么子查询的结果集将会有多个记录。这样,nvl函数的第一个参数就是一个多值的结果集,而不是一个单值的结果集,就发生ORA-01427的错误了。追问

查询每次都是按月查询的,group by 按年月分组,分组后count统计该分组的用户数,应该会得到一个YYYYMM月的登录用户数,又怎么会出现多行呢?

追答

如果确定只查询一个月范围内的数据,那么子查询中的group by t.riqi就可以不要了,直接count就好了。
会出现多行数据,问题就是出在group by t.riqi这里。
如果可以追踪的话,可以把nvl中的子查询独立开来执行一下,应该可以发现问题就在那里。

追问

真实数据接触不到,无法追踪,自己用测试数据测试的时候又不会出现这个问题,所以不太好找问题原因

温馨提示:答案为网友推荐,仅供参考
相似回答