PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PGError:ERROR:agregacje niedozwolone w klauzuli WHERE w zapytaniu AR obiektu i jego obiektów has_many

Komunikat o błędzie informuje:

agregaty niedozwolone w klauzuli WHERE

count() jest funkcją agregującą. Użyj w tym celu klauzuli HAVING.
Zapytanie może wyglądać tak:

SELECT r.*
FROM   recommendations r
JOIN   approvals       a ON a.recommendation_id = r.id
WHERE  r.user_id = $current_user_id
GROUP  BY r.id
HAVING count(a.recommendation_id) = 1

W PostgreSQL 9.1 lub nowszym wystarczy GROUP BY klucz podstawowy tabeli (zakładając, że recommendations.id jest PK). W wersjach Postgresa przed 9.1 trzeba było uwzględnić wszystkie kolumny SELECT listy, które nie są agregowane w GROUP BY lista. Z recommendations.* w SELECT lista, która byłaby każdą pojedynczą kolumną tabeli.

Cytuję informacje o wydaniu PostgreSQL 9.1:

Zezwól na inne niż GROUP BY kolumny na liście celów zapytania, gdy klucz podstawowy jest określony w GROUP BY klauzula (Peter Eisentraut)

Prostsze z podwyborem

Tak czy inaczej, jest to prostsze i szybsze, robiąc to samo:

SELECT *
FROM   recommendations r
WHERE  user_id = $current_user_id
AND   (SELECT count(*)
       FROM   approvals
       WHERE  recommendation_id = r.id) = 1;

Unikaj mnożenia wierszy za pomocą JOIN a priori, nie musisz ich ponownie agregować.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przyznać uprawnienia do przyszłych tabel w PostgreSQL?

  2. Wdrażanie i skalowanie PostgreSQL v13 za pomocą ClusterControl 1.8.2

  3. pg_restore Alternatywy - Kopia zapasowa PostgreSQL i automatyczne odzyskiwanie za pomocą ClusterControl

  4. psycopg2 odpowiednik mysqldb.escape_string?

  5. Zduplikowane wiersze w tabeli kluczy podstawowych.