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

Posted

技术标签:

【中文标题】Sql 错误 00904. 00000 - “%s: 无效标识符”【英文标题】:Sql error 00904. 00000 - "%s: invalid identifier" 【发布时间】:2015-05-27 19:26:47 【问题描述】:

我正在尝试执行以下 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
                );

但每次我尝试执行它时,我都会在第 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 中选择 *

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 级深度的圈状表的引用。 askTom's article on it 突出线:我们说过...... ANSI SQL 的表引用(相关名称)的范围只有一层 即使使用 select * from TURMAS aliasOfTurma, (select * from HISTORICOS aliasOfHistorico where aliasOfHistorico.ANO=aliasOfTurma.ANO);只是为了测试,它给出了同样的错误。 我非常强烈地觉得这应该是一个JOIN,而不是一个带有相关子查询的WHERE EXISTS。 【参考方案1】:

感谢 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: and we said... ANSI SQL has 表引用(相关名称)的范围仅限于一级深度

【讨论】:

以上是关于Sql 错误 00904. 00000 - “%s: 无效标识符”的主要内容,如果未能解决你的问题,请参考以下文章

SQL 错误:ORA-00904:“GENDER”:无效标识符 00904。00000 -“%s:无效标识符”

Oracle sql 连接计数给了我 00904 的错误。00000 - "%s: invalid identifier

SQL 无效标识符 00904.00000 - “%s:无效标识符”

SQL 查询 "00904.00000 - "%s: 无效标识符"

ORA-00904: 无效标识符 00904. 00000 - "%s: 无效标识符"

SQL 错误 ORA-00904:标识符无效