sql - 了解Oracle别名-为什么除非包装在第二个查询中,否则在查询中为什么不能识别别名?

标签 sql oracle plsql alias

我有一个查询


SELECT COUNT(*) AS "CNT",
       imei
FROM   devices  

执行得很好。我想使用WHERE语句进一步限制查询。 (人道的)逻辑下一步是随后修改查询:

SELECT COUNT(*) AS "CNT",
       imei
FROM   devices
WHERE  CNT > 1 

但是,这会导致错误消息 ORA-00904:“CNT”:无效的标识符。出于某种原因,将查询包装在另一个查询中会产生所需的结果:

SELECT *
FROM   (SELECT COUNT(*) AS "CNT",
               imei
        FROM   devices
        GROUP  BY imei)
WHERE  CNT > 1  

为什么Oracle在第二个查询中不能识别别名“CNT”?

最佳答案

简单的答案是AS子句定义了将在结果中调用的列,这是与查询本身不同的作用域。

在您的示例中,使用HAVING子句最有效:

SELECT COUNT(*) AS "CNT",
       imei
FROM   devices
GROUP  BY imei
HAVING COUNT(*) > 1

关于sql - 了解Oracle别名-为什么除非包装在第二个查询中,否则在查询中为什么不能识别别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6153778/

相关文章:

mysql - 数据库邻接列表模型 - 在一个查询中获取所有相同级别的父级?

sql - 是否可以在FOREIGN KEY的子表中插入行?

oracle - 在数据库所有表中搜索值

plsql - 两个值之间的条件选择

sql - 如何找到关系的 COUNT 结果的 MAX

java - 使用 hibernate 连接和分页复制记录

java - 使用 H2 和 Oracle 的 Spring Boot

oracle - 调用过程时错误的数量或类型的参数错误

oracle - 数字格式转换

java - 我的第一个自动 SQL 插入 : I feel im losing a lot of performance here