执行下面sql语句报错
select count(f1)
from testa
where f1=
( select max(f1)
from (
select f1 from
testb
where testb.f2>testa.f2
order by f1
)
where rownum<5
);ERROR 位于第 8 行:
ORA-00904: "A"."F2": 无效的标识符如果where语句里第二层子查询没有用到主表的字段没问题。
如何解决?
select count(f1)
from testa
where f1=
( select max(f1)
from (
select f1 from
testb
where testb.f2>testa.f2
order by f1
)
where rownum<5
);ERROR 位于第 8 行:
ORA-00904: "A"."F2": 无效的标识符如果where语句里第二层子查询没有用到主表的字段没问题。
如何解决?
select count(f1)
from testa
where f1=
( select max(f)
from (
select b.f1 f from
testa a,testb b
where b.f2>a.f2
order by b.f1
)
where rownum<5
);
SELECT COUNT(Deptno)
FROM Scott.Emp a
WHERE a.Deptno = (SELECT MAX(Deptno)
FROM (SELECT Scott.Dept.Deptno
FROM Scott.Dept
WHERE Scott.Dept.Deptno > a.Deptno
ORDER BY Scott.Dept.Deptno)
WHERE Rownum < 5);
但是报错,因为表emp跨了中间的select max() 查询,改为下面的可以:
SELECT COUNT(Deptno)
FROM Scott.Emp a
WHERE a.Deptno = (SELECT MAX(Scott.Dept.Deptno)
FROM Scott.Dept
WHERE Scott.Dept.Deptno > a.Deptno);但是没有了取前4条最大值的功能.
testa表是主表,统计testa表的记录数,f1,f2是两个日期型字段。
testb表是工作日表,f1是日期型字段,记录所有的工作日。
满足条件 testa表的f1=testa表的f2四个工作日后的记录。
sql重新写了一下:
select count(*) from testa
where f1=(select max(f1) from
(select f1 from testb
where f1>testa.f2
order by f1)
where rownum<5
)
ERROR 位于第 4 行:
ORA-00904: "TESTA"."F2": 无效的标识符
jxc(GameHeart):取前四条最大值肯定得要,要不结果就错了。
where f1 in (select f1 from
(select testb.f1 from testa,testb
where testb.f1>testa.f2
order by testb.f1 desc)
where rownum<5
);不要用max()函数,那样只能取得一条记录!
举例来说:
testb 中的f1存储
20050321
20050322
20050323
20050324
20050325
20050328
20050329
为工作日。
select max(f1) from
(select f1 from testb
where f1>testa.f2
order by f1)
where rownum<5
再假如testa.f2为20050320
则最里面的子查询得到很多符合条件的记录。
当进行max(f1)操作,不会按你设想的前进行
rownum<5的条件后再进行MAX,你要注意。
除非
select max(f1) from
(select f1 from
(select f1 from testb
where f1>testa.f2
order by f1)
where rownum<5)
这样才有可能。
还有,也许对应你testa表的f1的记录有若干条(否则你不会count(*))
在每一条里都有一个f2,那么在子查询中没有任何条件限制记录返回
条数,只会跳出单行查询返回多条记录的错误。最后,在你查询中对每个字段都加上表名进行标注会有帮助。
比如:
select count(*) from testa
where testa.f1=(select max(aa.f1) from
(select testb.f1 from testb
where tetsb.f1>testa.f2
order by testb.f1) aa
where rownum<5
)
我想你应该会得到进一步的错误提示。
理论上可以取得多条snowy_howe(天下有雪)
再假如testa.f2为20050320
则最里面的子查询得到很多符合条件的记录。
当进行max(f1)操作,不会按你设想的前进行
rownum<5的条件后再进行MAX,你要注意。
我试验的结果,是先进行rownum<5的条件后再进行MAX只会跳出单行查询返回多条记录的错误。
如果是一层子查询的话,不会报单行查询返回多条记录的错误的错误。
你查询中对每个字段都加上表名进行标注会有帮助。
好像还是不行呀
SQL> select * from testb;F1
----------
2005-03-18
2005-03-21
2005-03-22
2005-03-23
2005-03-24
2005-03-25
2005-03-28
2005-03-29已选择8行。SQL> select max(f1) from
2 (select f1 from testb order by f1)
3 where rownum < 5;MAX(F1)
----------
2005-03-23是我的错,没有测试,呵呵。
最后,可否请你提供表结构及数据(测试表也可)
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
F1 DATE
F2 DATESQL> DESC TESTB
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
F1 DATESQL> SELECT * FROM TESTA;F1 F2
---------- ----------
07-3月 -05 03-3月 -05
07-3月 -05 04-3月 -05
07-3月 -05 05-3月 -05SQL> select * from testb;F1
----------
03-3月 -05
04-3月 -05
05-3月 -05
06-3月 -05
07-3月 -05
10-3月 -05
11-3月 -05
12-3月 -05
13-3月 -05
14-3月 -05已选择10行。
testb表中存放的是所有工作日记录
统计testa表记录的个数,满足(以第一条记录为例)
testa表的F1等于 testa表中F2(03-3月 -05)的四个工作日后的日期(在testb表中查找,得到07-3月 -05)
from testa a, testb b
where a.f1=b.f1
and a.f2=b.f1+4
from testa
where f1=
( select max(f1)
from (
select f1 from
testb ,testa
where testb.f2>testa.f2 and testb.f1=testa.f1
order by f1
)
where rownum<5
);因为子查询中不能自动找主查询的表,没有
testb.f1=testa.f1
会出现迪卡尔集,可以根据情况换成testb.f1(+)=testa.f1或testb.f1=testa.f1(+)