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

问题描述

| 我有一个查询
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
    ,        因为文档说不会:   为列指定别名   表达。 Oracle数据库将使用   该列标题中的别名   结果集。 AS关键字是   可选的。有效的别名   重命名选择列表项   查询的持续时间。别名可以   可以在order_by_clause中使用,但不能   查询中的其他子句。 但是,当您具有内部选择时,就像创建一个内联视图(其中列别名生效)一样,因此您可以在外部级别使用该视图。     ,        我可以想象,因为直到处理完WHERE子句并生成数据后,别名才分配给结果列。 Oracle在这种行为上是否不同于其他DBMS?     ,        总而言之,这个小宝石解释了: 全面理解SQL的10个简单步骤   造成混淆的一个常见原因是,SQL语法很简单   元素没有按照执行方式排序。词汇   订购是:
SELECT [ DISTINCT ]
FROM
WHERE
GROUP BY
HAVING
UNION
ORDER BY
     为简单起见,未列出所有SQL子句。这种词法排序   从根本上不同于逻辑顺序,即与   执行:
FROM
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
UNION
ORDER BY
结果,用\“ AS \”标记的任何内容仅在执行
WHERE
,using4ѭ和
GROUP BY
之后才可用。