【问题标题】:MySQL error: Non-grouping field is used in HAVING clauseMySQL 错误:在 HAVING 子句中使用了非分组字段
【发布时间】:2016-03-27 05:13:00
【问题描述】:

有没有办法更正这个查询,以便它在启用ONLY_FULL_GROUP_BY 的情况下工作?

SELECT LOWER(s) AS lower_s, SUM(i) AS sum_i
FROM t
GROUP BY 1
HAVING LENGTH(lower_s) < 5

它给出了错误信息

在 HAVING 子句中使用了非分组字段“lower_s”

Fiddle

【问题讨论】:

  • 在 SQL Server 中,您不能在 having 子句中使用别名。也许试试having(LENGTH(LOWER(s)) &lt; 5

标签: mysql sql select group-by having


【解决方案1】:

你为什么不直接使用where LENGTH(LOWER(s)) &lt; 5

看来having的用法不在这里。

根据having sql wiki

SQL 中的 HAVING 子句指定 SQL SELECT 语句应仅返回聚合值满足指定条件的行。它被添加到 SQL 语言中是因为 WHERE 关键字不能与聚合函数一起使用。[1]

【讨论】:

  • 接受,因为“HAVING 仅适用于聚合字段”是我记得的。希望它不会影响性能。
【解决方案2】:

无需在查询中使用 HAVING 子句。检查以下满足您要求的查询。

试试这个:

SELECT LOWER(s) AS lower_s, SUM(i) AS sum_i
FROM t
WHERE LENGTH(LOWER(s)) < 5
GROUP BY 1;

【讨论】:

  • Length(s) 并不总是与 length(lower(s)) 相同。 (例如德语 STRAßE => strasse。)
  • @jarlh 好的,我不知道。谢谢你,我已经更新了我的答案。
  • @jarlh 这实际上是一个奇怪的评论。 ß 是小写字母,因此小写 ß 不会变成 ss。
  • @warly,好吧,我理解的糟糕例子。 (我可能是指相反的方向......德语不是我的第一语言,也不是第二语言。)但事实仍然存在,在某些语言中,当您对某些字符/组合进行大写/小写时,长度可能会改变。
【解决方案3】:

解决方法是:

SELECT LOWER(s) AS lower_s, SUM(i) AS sum_i 
FROM t 
WHERE LENGTH(lower_s) < 5 
GROUP BY 1

【讨论】:

  • 与@Saharsh Shah 回答有何不同
【解决方案4】:
select lower_s, SUM(i) AS sum_i
from
(
    SELECT LOWER(s) AS lower_s, i
    FROM t
) dt
where LENGTH(lower_s) < 5
GROUP BY lower_s

ANSI SQL 兼容答案,具有派生表,因此您只需编写一次 LOWER(s) 表达式。

【讨论】:

    猜你喜欢
    • 2016-12-27
    • 2017-12-22
    • 2018-05-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多