问题描述
|
我有一个查询
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
之后才可用。