2009-03-15 35 views
15

Phiên bản SQLite 3.4.0 Có gì sai với chức năng tổng hợp? Ngoài ra, tôi nghi ngờ rằng ORDER BY cũng không hoạt động. Làm thế nào để viết lại điều này?Lỗi SQL: lạm dụng tổng hợp

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> 

Trả lời

55

Khi sử dụng hàm tổng hợp (tổng/số/...), bạn cũng phải tận dụng mệnh đề GROUP BY.

Bên cạnh đó, khi bạn muốn lọc kết quả tổng hợp, bạn không thể làm điều đó trong mệnh đề WHERE, nhưng bạn phải làm điều đó trong mệnh đề 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 Tôi đoán việc sử dụng các hàm tổng hợp mà không có mệnh đề GROUP BY thích hợp được bắt nguồn từ những thói quen xấu được chuyển từ MySQL ... – Tomalak

+1

câu trả lời này đã tiết kiệm cho tôi nhiều phút cố gắng ghi nhớ cú pháp. hiểu lời giải thích. Chúc mừng @Frederik – OptimizePrime

+0

Có không lọc ra các cột cho tôi! –

2

ngắn phiên bản sửa lỗi cho điều này là:

Khi bạn đang sử dụng chức năng như COUNT/SUM, bạn cần phải sử dụng HAVING thay vì WHERE.

Các vấn đề liên quan