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: 无效标识符"