2009-03-15 8 views
15

SQLite versión 3.4.0 ¿Qué pasa con las funciones agregadas? Además, sospecho que ORDER BY no funcionará tan bien. ¿Cómo reescribir esto?Error de SQL: uso indebido de agregado

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> 

Respuesta

55

Cuando se utiliza una función de agregado (suma/recuento/...), también tiene que hacer uso de la cláusula GROUP BY.

Además de eso, cuando quiere filtrar el resultado de un agregado, no puede hacer eso en la cláusula WHERE, pero tiene que hacerlo en la cláusula 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; 
+3

+1 Supongo que el uso de funciones agregadas sin una cláusula GROUP BY adecuada está arraigada en los malos hábitos heredados de MySQL ... – Tomalak

+1

esta respuesta me ahorró muchos minutos tratando de recordar la sintaxis, y vino con un fácil entender la explicación Cheers @Frederik – OptimizePrime

+0

¡Tener no está filtrando las columnas por mí! –

2

corto versión de corrección de esto es:

Cuando se está usando la función como COUNT/SUM, es necesario utilizar HAVING en lugar de WHERE.

Cuestiones relacionadas