SQL> select ename,sal from emp where sal in (select max(sal),min(sal) from emp);
ERROR 位于第 1 行:
ORA-00913: 值过多
我觉得这样的句子没问题,因为下面这个句子就不会出错,上面那个只是一个子句而已,而且返回的值就是5000,和800.
SQL> select ename,sal from emp where sal in (5000,800);
困扰,求解
...全文
138320打赏收藏
子查询的问题,子句提供多值,提示ORA-00913: 值过多??
查询是这样写的,但执行有错。 SQL> select ename,sal from emp where sal in (select max(sal),min(sal) from emp); ERROR 位于第 1 行: ORA-00913: 值过多 我觉得这样的句子没问题,因为下面这个句子就不会出错,上面那个只是一个子句而已,而且返回的值就是5000,和800. SQL> select ename,sal from emp where sal in (5000,800); 困扰,求解
in可以用在(select max(sal) from emp union all select min(sal) from emp)上,是2条记录,而不是并列的2个字段.(5000,800)是2个值,不是一个值中的2个字段
可以改成
select ename,sal from emp a
where not exists(select 1 from emp where sal>a.sal)
or not exists(select 1 from emp where sal<a.sal);
因为sal值为空值的时候不能进行<和>比较
可以加个条件
select ename,sal from emp a
where (not exists(select 1 from emp where sal>a.sal)
or not exists(select 1 from emp where sal <a.sal))
and sal is not null;
比较下执行计划,这么写效率可能会比写2个聚合的子查询高一点
[Quote=引用 17 楼 wildwave 的回复:]
in可以用在(select max(sal) from emp union all select min(sal) from emp)上,是2条记录,而不是并列的2个字段.(5000,800)是2个值,不是一个值中的2个字段
可以改成
select ename,sal from emp a
where not exists(select 1 from emp where sal>a.sal)
or not exists(select 1 from emp where sal <a.sal);
[/Quote]
我才开始学 。。。基本看不明白,而且帖子昨晚已经结了
不过我试了一下,如果表里面我加一个 sal 为空的人(Peter) ,那么结果会是:
ENAME SAL
---------- ----------
SMITH 800
KING 5000
Peter
也许你这样的结果才是对的?
这句的结果是:其中
SQL> select ename,sal from emp where sal =(select max(sal) from emp) or sal=(select min(sal) from emp);
ENAME SAL
---------- ----------
SMITH 800
KING 5000
[Quote=引用 6 楼 sbfuksn775 的回复:]
select ename,sal from emp where sal in (select max(sal) from emp) and sal in (select min(sal) from emp)
你这样写看下吧,西西,多少要给点 分的,继续关注。。
[/Quote]
你用的 and 不行诶, 提示 未选定行 。。。
[Quote=引用 4 楼 sbfuksn775 的回复:]
select ename,sal from emp where sal in (select max(sal),min(sal) from emp);
兄弟你where后面要跟个确定的值,西西有两个当然会这样提示你了。
select ename,sal from emp where sal in (select max(sal)from emp);
[/Quote]
恩,一个 max(sal) 是没问题 ,这个我试了。
可是 select ename,sal from emp where sal in (5000,800); 有两个值也不会报错呀。
如果子句提供多值报错的话,万一有这种需求岂不很麻烦了
select ename,sal from emp where sal in (select max(sal),min(sal) from emp);
兄弟你where后面要跟个确定的值,西西有两个当然会这样提示你了。
select ename,sal from emp where sal in (select max(sal)from emp);