sql >> Database teknologi >  >> RDS >> PostgreSQL

PGError:FEJL:aggregater er ikke tilladt i WHERE-klausulen på en AR-forespørgsel af et objekt og dets har_mange objekter

Fejlmeddelelsen fortæller dig:

aggregater er ikke tilladt i WHERE-klausulen

count() er en aggregeret funktion. Brug HAVING-sætningen til det.
Forespørgslen kunne se sådan ud:

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

Med PostgreSQL 9.1 eller nyere er det nok at GROUP BY den primære nøgle af en tabel (forudsat recommendations.id er PK). I Postgres-versioner før 9.1 skulle du inkludere alle kolonner i SELECT liste, der ikke er samlet i GROUP BY liste. Med recommendations.* i SELECT liste, det ville være hver enkelt kolonne i tabellen.

Jeg citerer udgivelsesnoterne til PostgreSQL 9.1:

Tillad ikke-GROUP BY kolonner i forespørgselsmållisten, når primærnøglen er angivet i GROUP BY klausul (Peter Eisentraut)

Enklere med et undervalg

Uanset hvad, er dette enklere og hurtigere ved at gøre det samme:

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

Undgå at gange rækker med en JOIN a priori, så behøver du ikke at samle dem tilbage.



  1. Dynamisk pivotforespørgsel ved hjælp af PostgreSQL 9.3

  2. Jeg kan ikke bruge mysql_* funktioner efter opgradering af PHP

  3. Hvordan renser (forhindrer SQL-injektion) dynamisk SQL i SQL Server?

  4. Hvilken .NET-datatype er bedst til at kortlægge NUMBER Oracle-datatypen i NHibernate?