nvl是一个标量函数,在你的SQL语句中,nvl第一个参数是一个子查询。而该子查询是按日期统计用户登录的次数(group by triqi),如果查询范围在一天之内,因为triqi就是一个值,子查询的结果集中只有一条记录,是没有问题的;而如果查询的日期范围超出1天,且有用户在不同的日期有登录,那么子查询的结果集将会有多个记录。这样,nvl函数的第一个参数就是一个多值的结果集,而不是一个单值的结果集,就发生ORA-01427的错误了。
我来回答一下,这个问题不好说清楚
学生表
-- 查询1、查询出 年龄 = 17 的所有学生
select t from 学生表 t where t年龄 = 17;
-- 查询2、查询出 年龄 = 17 或者 = 18 的所有学生
select t from 学生表 t where t年龄 in (17, 18);
-- 查询3、查询出 性别 = 男 的所有学生,这里因为子查询“学生表 t2”只有一条记录满足条件(即单列单行),所以查询不会报错
select t from 学生表 t where t年龄 = (
select t2年龄
from 学生表 t2 where t2性别 = '男'
);
-- 查询4、查询出 年龄 = 17 的所有学生,这里因为子查询 “学生表 t2” 有两条数据符合条件(即单列多行),而 “t性别 =” 只能等于某一个给定的值,参考 “查询1” ,所以执行查询会报错;这里把 = 替换为 =any 或者 in 就可以正常查询,因为 =any 和 in 是告诉 “t性别” 要找的数据必须在我范围内;而 <> any 和 not in 则表示取反的意思,告诉 “t性别” 要找的数据必须排除我给你的范围。
select t from 学生表 t where t性别 = (
select t2性别
from 学生表 t2 where t2年龄 = 17
);
-- ANY 和 ALL 的具体用法,这里不再赘述。。。。
-- 查询5、多列多值,参考查询4,子查询 “学生表 t2” 满足条件的有两条,如下查询:
select t from 学生表 t where t年龄 || t性别 =any (
select t2年龄 || t2性别
from 学生表 t2 where t2性别 = '男'
);
注1:其实 ANY 和 ALL 不涉及什么多行多列,查询5只是一种另类的解决方案。
注2:“||” 双数线表示 在 ORACLE 数据库中用来做合并的关键字符。
总结:
首先,请不要在查询1、2、3、4、5上过于纠结,说什么我可以用更简单的SQL实现你的查询1、2、3、4、5,我这里仅仅是为了举例说明。
select t from 学生表 t where t年龄 = 17;
= 后面可以是一个 特定的值,可以是一个 子查询等等,但是需要保证 = 后面的任何运算或查询只返回一个值,不然SQL是无法执行的;
而 any 和 all 以及 in,表示的是一个数据范围,即单列多行,而使用 双竖线 是把 多列合并为一列来处理,最终还是模拟的单列多行。
一:queryForList()是需要传递参数的,你这里没有传参。
二:queryForList()方法返回的是个list集合,你在queryForList()get(0)之前,先判断list中是否有值,可以用(listsize()>0)这样即可,一般就不会出现异常。
以上就是关于数据库转换问题全部的内容,包括:数据库转换问题、数据库函数有哪些、oracle数据库查询报错:ORA-01427: 单行子查询返回多个行等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)