Sql错误00904. 00000 - “%s:无效标识符”

时间:2015-05-27 19:26:47

标签: sql oracle oracle11g

我正在尝试执行以下sql查询

select * 
from TURMAS t
where exists (select * 
                from (
                     select count(*) Alunos 
                        from HISTORICOS h1 
                        where h1.ANO = t.ANO
                        and h1.SEMESTRE = t.SEMESTRE 
                        and h1.COD_DISC = t.COD_DISC
                      ) a ,
                     (
                     select count(*) Reprovados
                        from HISTORICOS h2 
                        where h2.SITUACAO <> 'AP' 
                        and h2.ANO = t.ANO 
                        and h2.SEMESTRE = t.SEMESTRE
                        and h2.COD_DISC = t.COD_DISC
                      ) r
                 where ((r.REPROVADOS * 100) / a.ALUNOS) >= 60
                );

但是每当我尝试执行它时,我得到(00904. 00000 - “%s:无效标识符”)第24行(或任何其他行我尝试使用TURMAS的别名,即使我尝试使用TURMAS没有别名。

我在查询中找不到错误。

这是描述TURMAS

SQL> describe turmas
 Nome                                      Nulo?    Tipo
 ----------------------------------------- -------- -------------------------
 ANO                                       NOT NULL NUMBER(4)
 SEMESTRE                                  NOT NULL NUMBER(1)
 COD_DISC                                  NOT NULL NUMBER(6)
 VAGAS                                     NOT NULL NUMBER(3)
 IDT_PROF                                           NUMBER(6)

SQL描述HISTORICOS

SQL> describe historicos
 Nome                                      Nulo?    Tipo
 ----------------------------------------- -------- -------------------------
 ANO                                       NOT NULL NUMBER(4)
 SEMESTRE                                  NOT NULL NUMBER(1)
 MAT_ALU                                   NOT NULL NUMBER(10)
 COD_DISC                                  NOT NULL NUMBER(6)
 SITUACAO                                  NOT NULL CHAR(2)
 MEDIA                                     NOT NULL NUMBER(3,1)
 FALTAS                                    NOT NULL NUMBER(3)

和来自V $ VERSION的select *

SQL> SELECT * FROM V$VERSION;

BANNER
-----------------------------------------------------------------------------
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE    11.2.0.2.0      Production
TNS for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production

我在Oracle SQL Developer和Dbeaver上都遇到了同样的错误,当我尝试使用相同的东西但是使用t。****一个常量时,它可以工作。

1 个答案:

答案 0 :(得分:0)

感谢xQbert链接,它起作用了。我甚至没有想过深度?丑陋,性能不佳的问题,但它现在有效,因为它必须在2小时内交付,而且对于大学而言不是工作查询,它​​会做。

select * 
from TURMAS t
where (
      select count(*) Alunos 
            from HISTORICOS h1 
            where h1.ANO = t.ANO
            and h1.SEMESTRE = t.SEMESTRE 
            and h1.COD_DISC = t.COD_DISC
      ) > 0
and(
        select count(*) * 0.6 Alunos 
            from HISTORICOS h1 
            where h1.ANO = t.ANO
            and h1.SEMESTRE = t.SEMESTRE 
            and h1.COD_DISC = t.COD_DISC
      ) <= (
         select count(*) Reprovados
            from HISTORICOS h2 
            where h2.SITUACAO <> 'AP' 
            and h2.ANO = t.ANO 
            and h2.SEMESTRE = t.SEMESTRE

xQbert

  

我没想到你可以在1个以上的嵌套表中嵌套引用       水平深。 askTom的文章Salient line:我们说... ANSI SQL有       表引用(相关名称)范围只限于一个深度