SQL 聚合和别名

标签 sql

如果项目在表中被多次引用,我有一个查询需要返回一个标量值。

SELECT 
    COUNT(*)
FROM 
    Items
WHERE
    FKID = 2003799
GROUP BY 
    FKID 
HAVING 
    COUNT(*)>1 
ORDER BY 
    COUNT(*)

为什么我不能为聚合分配别名,并在其余查询中引用别名而不是重复聚合函数?

类似于:

SELECT 
    COUNT(*) AS CountById
FROM 
    Items
WHERE
    FKID = 2003799
GROUP BY 
    FKID 
HAVING 
    CountById>1 
ORDER BY 
    CountById

编辑 - 是否有允许相同想法的替代语法?

最佳答案

基本上,答案是...最后解释 SELECT 列表...这基本上是顺序...参见 http://databases.aspfaq.com/database/how-do-i-use-a-select-list-alias-in-the-where-or-group-by-clause.html .

  1. 从 FROM 子句开始,从所有连接、并集、交集和任何其他表构造函数构建一个工作表。 AS 选项允许您为此工作表命名,然后您必须将其用于包含查询的其余部分。

  2. 转到 WHERE 子句并删除不符合条件的行;也就是说,不测试为 TRUE(拒绝 UNKNOWN 和 FALSE)。 WHERE 子句适用于 FROM 子句中的工作。

  3. 转到可选的 GROUP BY 子句,创建组并将每个组减少为一行,用新的分组表替换原始工作表。分组表的行必须是组特征:(1)分组列(2)关于组的统计(即聚合函数)(3)函数或(4)由这三项组成的表达式。

  4. 转到可选的 HAVING 子句并将其应用于分组工作表;如果没有 GROUP BY 子句,则将整个表视为一个组。

  5. 转到 SELECT 子句并构造列表中的表达式。这意味着 SELECT 中的标量子查询、函数调用和表达式在所有其他子句完成后完成。 AS 运算符也可以为 SELECT 列表中的表达式命名。这些新名称立即全部存在,但是在执行 WHERE 子句之后;由于这个原因,您不能在 SELECT 列表或 WHERE 子句中使用它们。

  6. 嵌套查询表达式遵循 block 结构化语言(如 C、Pascal、Algol 等)所期望的常用范围规则。也就是说,最内层的查询可以引用包含它们的查询中的列和表。

关于SQL 聚合和别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4818207/

相关文章:

mysql - Postgresql 合并来自 JOIN 的相同列

sql - PostgreSQL 将列转换为行?转置?

SQL 从 3 位小数舍入到 2 位小数

sql - 从(非索引/非顺序)大文件中提取新行的好方法

mysql - 查看 MySQL Workbench 中级联删除的完整效果?

sql - 我如何在一个 SQL 语句中加入这个查询?

sql - 复合外键引用2个不同的表

mysql - 按日期顺序对评论排序的问题

sql - 根据 Value 重置行 ID

sql - 插入和更新触发器