【问题标题】:Strange "misuse of aggregate: max()" error in SQLiteSQLite 中奇怪的“滥用聚合:max()”错误
【发布时间】:2018-10-10 01:20:29
【问题描述】:

我有一个结构非常简单的 SQLite 表:

CREATE TABLE `test` ( `id` INTEGER, `val` TEXT )

我只想选择 val 字段值等于字符串“test_id”的最大 id:

SELECT max(id) AS test_id FROM test WHERE val = "test_id"  // (1)

请注意,我在 WHEREtest_id 中使用“test_id”字符串作为自定义列名。我得到错误:

misuse of aggregate: max(): SELECT max(id) AS test_id FROM test WHERE val = "test_id"

如果我将 max(id) AS test_id 更改为 max(id) AS test_id2WHERE val = "test_id" 更改为 WHERE val = "test_id_something" - 一切正常。

在 MySQL 中,原始 SELECT (1) 没有错误。更正后的版本效果很好。 我在做什么错?是否不允许在WHERE 中使用相同的文本并作为 SQLite 中的列名?

【问题讨论】:

  • WHERE 即使通过别名也不能使用聚合函数
  • "test_id" 更改为'test_id'(双引号改为单引号)也可以。
  • 您能解释一下您要查找的内容吗?是具有最高 id 的行,其 value = "tast_value"
  • @AryedovEidelman 想象“val”字段描述行类型。例如,它可以是“书”、“CD”、“电影”。如果我想找到类型为“CD”的最高 id,我需要类似:SELECT max(id) AS Book FROM test WHERE val = "Book"

标签: select sqlite where


【解决方案1】:

你已经回答了自己的问题

如果我将 max(id) AS test_id 更改为 max(id) AS test_id2 或 WHERE val = "test_id" 更改为 WHERE val = "test_id_something" - 一切正常。

WHERE val = "test_id" 引用 max(id) AS test_id。您需要使用不同的名称。试试这个

SELECT max(id) AS max_id FROM test WHERE val = "some_value"

misuse of aggregate: max(): 是在WHERE 子句中使用聚合函数(AVGCOUNTMINMAXSUM...)的正常结果

http://sqlfiddle.com/#!7/b28b3/11

【讨论】:

    【解决方案2】:

    在 SQL 中,双引号用于引用列/表名,test_id 确实是列名。字符串用单引号分隔:

    SELECT max(id) AS test_id FROM test WHERE val = 'test_id'
    

    SQLite 允许字符串使用双引号,以便与 MySQL 兼容,但如果有疑问,则必须选择标准解释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-19
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      相关资源
      最近更新 更多