sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL -moet voorkomen in de GROUP BY-component of worden gebruikt in een aggregatiefunctie

Als user_id is de PRIMAIRE SLEUTEL dan moet je PostgreSQL upgraden; nieuwere versies zullen het groeperen op de primaire sleutel correct afhandelen.

Als user_id is niet uniek noch de primaire sleutel voor de betreffende 'estates'-relatie, dan heeft deze query niet veel zin, aangezien PostgreSQL op geen enkele manier kan weten welke waarde die moet worden geretourneerd voor elke kolom van estates waar meerdere rijen dezelfde user_id . delen . Je moet een verzamelfunctie gebruiken die uitdrukt wat je wilt, zoals min , max , avg , string_agg , array_agg , etc of voeg de kolom(men) van belang toe aan de GROUP BY .

Als alternatief kunt u de zoekopdracht herformuleren om DISTINCT ON te gebruiken en een ORDER BY als je echt een wat willekeurige rij wilt kiezen, hoewel ik echt betwijfel of het mogelijk is om dat via ActiveRecord uit te drukken.

Sommige databases - waaronder SQLite en MySQL - kiezen gewoon een willekeurige rij. Dit wordt door het PostgreSQL-team als onjuist en onveilig beschouwd, dus PostgreSQL volgt de SQL-standaard en beschouwt dergelijke zoekopdrachten als fouten.

Als je het volgende hebt:

col1    col2
fred    42
bob     9
fred    44
fred    99

en jij doet:

SELECT col1, col2 FROM mytable GROUP BY col1;

dan is het duidelijk dat je de rij moet krijgen:

bob     9

maar hoe zit het met het resultaat voor fred ? Er is niet één juist antwoord om te kiezen, dus de database zal weigeren om dergelijke onveilige zoekopdrachten uit te voeren. Als je de beste . wilt col2 voor elke col1 je zou de max . gebruiken totaal:

SELECT col1, max(col2) AS max_col2 FROM mytable GROUP BY col1;


  1. Hoe u uw Access-databases ultrasnel kunt maken!

  2. Kan sorteerconflict niet oplossen

  3. Ongeldige SQL-fout in kolomnaam

  4. Groeperen op clausule in mySQL en postgreSQL, waarom de fout in postgreSQL?