执行下面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语句里第二层子查询没有用到主表的字段没问题。
如何解决?

解决方案 »

  1.   

    应该说说你想实现的功能,看起来有点问题,不通
    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 
       );
      

  2.   

    这个例子和你的查询相似, 而且报错:
    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条最大值的功能.
      

  3.   

    功能是这样的
    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": 无效的标识符
      

  4.   

    skystar99047(天星):你的方案应该是不行的。子查询不能精确定位某条记录。
     jxc(GameHeart):取前四条最大值肯定得要,要不结果就错了。
      

  5.   

    select * from testa
    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()函数,那样只能取得一条记录!
      

  6.   

    对你的需求还是不甚了解。
    举例来说:
    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
              )
    我想你应该会得到进一步的错误提示。
      

  7.   

    flood110():不要用max()函数,那样只能取得一条记录!
       理论上可以取得多条snowy_howe(天下有雪)
    再假如testa.f2为20050320
    则最里面的子查询得到很多符合条件的记录。
    当进行max(f1)操作,不会按你设想的前进行
    rownum<5的条件后再进行MAX,你要注意。
        我试验的结果,是先进行rownum<5的条件后再进行MAX只会跳出单行查询返回多条记录的错误。
        如果是一层子查询的话,不会报单行查询返回多条记录的错误的错误。
    你查询中对每个字段都加上表名进行标注会有帮助。
        好像还是不行呀
      

  8.   

    首先:
    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是我的错,没有测试,呵呵。
    最后,可否请你提供表结构及数据(测试表也可)
      

  9.   

    SQL> DESC TESTA
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     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)
      

  10.   

    select count(*)
    from testa a, testb b
    where a.f1=b.f1
    and a.f2=b.f1+4
      

  11.   

    select count(f1)
    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(+)