sql >> Databáze >  >> RDS >> PostgreSQL

PGError:ERROR:agregace nejsou povoleny v klauzuli WHERE v dotazu AR na objekt a jeho has_many objektů

Chybová zpráva vám říká:

agregáty nejsou povoleny v klauzuli WHERE

count() je agregační funkce. K tomu použijte klauzuli HAVING.
Dotaz může vypadat takto:

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

S PostgreSQL 9.1 nebo novějším stačí GROUP BY primární klíč tabulky (za předpokladu recommendations.id je PK). Ve verzích Postgres před 9.1 jste museli zahrnout vše sloupců SELECT seznam, který není agregován v GROUP BY seznam. S recommendations.* v SELECT seznam, to by byl každý jednotlivý sloupec tabulky.

Cituji poznámky k vydání PostgreSQL 9.1:

Povolit jiné než GROUP BY sloupce v seznamu cílů dotazu, když je primární klíč zadán v GROUP BY klauzule (Peter Eisentraut)

Jednodušší s dílčím výběrem

Ať tak či onak, toto je jednodušší a rychlejší a dělá to samé:

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

Vyhněte se násobení řádků pomocí JOIN a priori, pak je nemusíte zpětně agregovat.



  1. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Selhání komunikačního odkazu

  2. SqlParameter neumožňuje Název tabulky - další možnosti bez útoku sql injection?

  3. Dosažení převzetí služeb při selhání a zpětného selhání MySQL na platformě Google Cloud Platform (GCP)

  4. Jak zajistím, aby výčty Java a Postgres spolupracovaly při aktualizaci?