【问题标题】:SQL error: misuse of aggregateSQL 错误:滥用聚合
【发布时间】:2010-10-13 11:33:51
【问题描述】:

SQLite 版本 3.4.0 聚合函数有什么问题?此外,我怀疑 ORDER BY 也不会起作用。如何重写这个?

sqlite> SELECT p1.domain_id, p2.domain_id, COUNT(p1.domain_id) AS d1, COUNT(p2.domain_id) AS d2
   ...> FROM PDB as p1, Interacting_PDBs as i1, PDB as p2, Interacting_PDBs as i2
   ...> WHERE p1.id = i1.PDB_first_id
   ...> AND p2.id = i2.PDB_second_id
   ...> AND i1.id = i2.id
   ...> AND d1>100
   ...> AND d2>100
   ...> ORDER BY d1, d2;
SQL error: misuse of aggregate: 
sqlite>

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    使用聚合函数(sum / count / ...)时,还必须使用 GROUP BY 子句。

    除此之外,当您想要过滤聚合的结果时,您不能在 WHERE 子句中执行此操作,但您必须在 HAVING 子句中执行此操作。

    SELECT p1.domain_id, p2.domain_id, COUNT(p1.domain_id) AS d1, COUNT(p2.domain_id) AS d2
        FROM PDB as p1, Interacting_PDBs as i1, PDB as p2, Interacting_PDBs as i2
        WHERE p1.id = i1.PDB_first_id
        AND p2.id = i2.PDB_second_id
        AND i1.id = i2.id
    GROUP BY p1.domain_Id, p2.domain_Id
    HAVING d1 > 100 AND d2 > 100
    ORDER BY d1, d2;
    

    【讨论】:

    • +1 我猜在没有适当的 GROUP BY 子句的情况下使用聚合函数的根源在于 MySQL 遗留下来的坏习惯......
    • 这个答案为我节省了很多时间来试图记住语法,并且它带有一个易于理解的解释。干杯@Frederik
    • 没有为我过滤掉列!
    • "SELECT *, group_concat(" + TABLE_SUBJECT + "."+COLUMN_TYPE + ") AS type, + "FROM " + TABLE_STUDENT + " " + "INNER JOIN " + TABLE_SUBJECT + " ON " + TABLE_STUDENT + "." + COLUMN_ID + " = " + TABLE_SUBJECT + "." + COLUMN_STUDENT_ID + " WHERE " + TABLE_STUDENT + "." + COLUMN_ID + " = 3 " + "GROUP BY TABLE_SUBJECT + "." + COLUMN_STUDENT_ID + "HAVING type = " MATH " + "OR type = ENGLISH";
    • 这是我的查询,但结果还包含第三个主题,而我只想要上面的 2 个。你能帮忙吗?
    【解决方案2】:

    对此的短版修复是:

    当你使用像COUNT/SUM这样的函数时,你需要使用HAVING而不是WHERE

    【讨论】:

    • 你是对的,但为什么呢?我尝试在“WHERE”子句中使用聚合函数过滤掉一些数据;但是它没有用。它仅适用于“HAVING”子句。有什么特别的原因吗?
    【解决方案3】:

    还要确保你们中的任何一列都没有在 WHERE 子句中使用 COUNT/SUM。确保对这些变量使用 HAVING 而不是 WHERE。

    【讨论】:

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