【发布时间】: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。