sim*_*mon 7 sql oracle alias plsql
我有一个问题
SELECT COUNT(*) AS "CNT",
imei
FROM devices
Run Code Online (Sandbox Code Playgroud)
执行得很好.我想用WHERE语句进一步限制查询.(人性)逻辑下一步是随后修改查询:
SELECT COUNT(*) AS "CNT",
imei
FROM devices
WHERE CNT > 1
Run Code Online (Sandbox Code Playgroud)
但是,这会导致错误消息ORA-00904:"CNT":标识符无效.出于某种原因,将查询包装在另一个查询中会产生所需的结果:
SELECT *
FROM (SELECT COUNT(*) AS "CNT",
imei
FROM devices
GROUP BY imei)
WHERE CNT > 1
Run Code Online (Sandbox Code Playgroud)
为什么Oracle在第二个查询中无法识别别名"CNT"?
简单的答案是该AS
子句定义了在结果中调用列的内容,这是与查询本身不同的范围.
在您的示例中,使用该HAVING
子句最有效:
SELECT COUNT(*) AS "CNT",
imei
FROM devices
GROUP BY imei
HAVING COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)
总而言之,这个小宝石解释了:
造成混淆的一个常见原因是一个简单的事实:SQL 语法元素的顺序并不按照它们的执行方式排序。词汇顺序是:
Run Code Online (Sandbox Code Playgroud)SELECT [ DISTINCT ] FROM WHERE GROUP BY HAVING UNION ORDER BY
为简单起见,未列出所有 SQL 子句。这种词法顺序与逻辑顺序(即执行顺序)有根本的不同:
Run Code Online (Sandbox Code Playgroud)FROM WHERE GROUP BY HAVING SELECT DISTINCT UNION ORDER BY
因此,您使用“AS”标记的任何内容只有在执行WHERE
,HAVING
和GROUP BY
后才可用。
归档时间: |
|
查看次数: |
11378 次 |
最近记录: |