Ошибка SQL: неправильное использование агрегата

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>

Ответы

Ответ 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;

Ответ 2

Исправление короткой версии для этого:

Когда вы используете функцию типа COUNT/SUM, вам нужно использовать HAVING вместо WHERE.