PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PGError:ГРЕШКА:агрегатите не са разрешени в клаузата WHERE на AR заявка на обект и неговите has_many обекти

Съобщението за грешка ви казва:

агрегати не са разрешени в клауза WHERE

count() е агрегатна функция. Използвайте клаузата HAVING за това.
Заявката може да изглежда така:

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

С PostgreSQL 9.1 или по-нова версия е достатъчно да GROUP BY първичния ключ на таблица (предполагайки recommendations.id е ПК). Във версиите на Postgres преди 9.1 трябваше да включите всички колони на SELECT списък, които не са агрегирани в GROUP BY списък. С recommendations.* в SELECT списък, това ще бъде всяка отделна колона на таблицата.

Цитирам бележките към версията на PostgreSQL 9.1:

Разрешаване на не-GROUP BY колони в списъка с цели на заявката, когато първичният ключ е посочен в GROUP BY клауза (Peter Eisentraut)

По-просто с подселекция

Така или иначе, това е по-просто и по-бързо, като правите същото:

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

Избягвайте умножаването на редове с JOIN a priori, тогава не е нужно да ги агрегирате обратно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Тествайте за нула във функция с различни параметри

  2. PostgreSQL:Пуснете PostgreSQL база данни през командния ред

  3. Не мога да намеря заглавката 'libpq-fe.h при опит за инсталиране на pg gem

  4. PostgreSQL UNIX домейн сокети срещу TCP сокети

  5. Еквивалент на параметър с таблица в Postgresql