2009-03-15 8 views
15

Versione SQLite 3.4.0 Cosa c'è di sbagliato nelle funzioni di aggregazione? Inoltre, sospetto che ORDER BY non funzionerà altrettanto bene. Come riscrivere questo?Errore SQL: uso errato dell'aggregato

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> 

risposta

55

Quando si utilizza una funzione di aggregazione (somma/conteggio/...), si devono anche avvalersi della clausola GROUP BY.

Accanto a questo, quando si desidera filtrare il risultato di un aggregato, non è possibile farlo nella clausola WHERE, ma è necessario farlo nella clausola 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 Immagino che l'uso di funzioni aggregate senza una clausola GROUP BY corretta sia radicata in cattive abitudini trasferite da MySQL ... – Tomalak

+1

questa risposta mi ha salvato molti minuti cercando di ricordare la sintassi, ed è venuto con un facile capire la spiegazione Cheers @Frederik – OptimizePrime

+0

Avere non sta filtrando le colonne per me! –

2

breve versione correzione per questo è:

Quando si utilizza la funzione come COUNT/SUM, è necessario utilizzare HAVING invece di WHERE.

Problemi correlati