如何使用Oracle中WHERE子句中SELECT子句中定义的别名?

如何使用Oracle中WHERE子句中SELECT子句中定义的别名?,oracle,aggregate-functions,alias,Oracle,Aggregate Functions,Alias,我提出这个问题: SELECT num_aula, tipo_aula, min(abs(250-capienza) as x FROM aula join ( select num_aula, tipo_aula from aula minus select num_aula, tipo_aula from occr_lezione WHERE trunc(Data_inizio_occr_lezione) >= trunc(next_day(sysdate,'lunedi')) AND

我提出这个问题:

SELECT num_aula, tipo_aula, min(abs(250-capienza) as x
FROM aula
join (
select num_aula, tipo_aula
from aula
minus
select num_aula, tipo_aula
from occr_lezione
WHERE trunc(Data_inizio_occr_lezione) >= trunc(next_day(sysdate,'lunedi'))
AND   trunc(Data_inizio_occr_lezione) <= trunc(next_day(sysdate,'venerdi'))
AND to_char(Data_inizio_occr_lezione,'hh24:mi') = '08:30'
AND Nome_sede = 'Centro Direzionale'
AND Giorno_lezione = 1)
using(num_aula,tipo_aula)
WHERE rownum = 1
AND   tipo_aula = 'Laboratorio'
AND   x < 10
group by num_aula, tipo_aula;
正如您在where子句中看到的,我的x<10会引发一个not a valid标识符错误。怎么样?如果无法访问,是否有方法访问select语句where中的聚合函数列

我试过这个:

With x as(
SELECT num_aula, tipo_aula, min(abs(250-capienza)) minimo
FROM aula
join (
select num_aula, tipo_aula
from aula
minus
select num_aula, tipo_aula
from occr_lezione
WHERE trunc(Data_inizio_occr_lezione) >= trunc(next_day(sysdate,'lunedi'))
AND   trunc(Data_inizio_occr_lezione) <= trunc(next_day(sysdate,'venerdi'))
AND to_char(Data_inizio_occr_lezione,'hh24:mi') = '08:30'
AND Nome_sede = 'Centro Direzionale'
AND Giorno_lezione = 1)
using(num_aula,tipo_aula)
group by num_aula, tipo_aula)
SELECT *
FROM x
WHERE rownum = 1
AND   x.tipo_aula = 'Aula'
AND   x.minimo < 15;
这是否比所建议的条款更糟

还有一个问题需要解决:

如果我使用HAVING语句,我必须在条款中进行比较,例如:

HAVING min(abs(250-capienza)) < > = <> something
如果我不使用它,我就无法访问我感兴趣的专栏

那么,如果我想选择具有最小值的行而不与其他行进行比较,我该怎么办?

而不是

 AND   x < 10
在group by之后使用having子句:

 HAVING min(abs(250-capienza)) < 10
而不是

 AND   x < 10
在group by之后使用having子句:

 HAVING min(abs(250-capienza)) < 10

在执行项目操作选择某些列之前,将应用行级筛选器。这就是为什么不能在同一WHERE子句中使用列别名。您必须将查询包装在另一个SELECT语句中,并将条件应用于该语句

SELECT * from ( 
/*... SELECT my_column as x  ... */
)
where x < 10

在执行项目操作选择某些列之前,将应用行级筛选器。这就是为什么不能在同一WHERE子句中使用列别名。您必须将查询包装在另一个SELECT语句中,并将条件应用于该语句

SELECT * from ( 
/*... SELECT my_column as x  ... */
)
where x < 10

我要注意的是,在这里和原始代码中,在capienza之后需要两个正确的paren,而不仅仅是一个。好的,刚刚发现having子句正是为这个purpouse而设计的。你知道的越多!感谢@SMAty@justinCave,老实说,这只是副本引起的一个错误:我只是注意到,在这里和原始代码中,在capienza之后,您需要两个正确的参数,而不仅仅是一个。好的,刚刚发现having子句正是为这个目的而设计的。你知道的越多!谢谢@SMAty@justinCave这只是由于拷贝造成的一个错误。老实说:谢谢你们抽出时间,先生们。。。。只是提醒一下,并不是所有人都是男性*{;-哦,天哪,你完全正确@Boneistt最后一个困境正在吞噬我。谢谢你的时间,先生们….只是提醒一下,我们不是所有人都有男性的说服力!*{;-哦,天哪,你完全正确@Boneistt最后一个困境正在吞噬我。