PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL -muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden

Wenn user_id ist der PRIMÄRSCHLÜSSEL dann müssen Sie PostgreSQL aktualisieren; Neuere Versionen behandeln die Gruppierung nach dem Primärschlüssel korrekt.

Wenn user_id ist weder noch eindeutig der Primärschlüssel für die fragliche Relation ‚Estates‘, dann macht diese Abfrage nicht viel Sinn, da PostgreSQL keine Möglichkeit hat zu wissen, welcher Wert, der für jede Spalte von estates zurückgegeben werden soll wo mehrere Zeilen dieselbe user_id teilen . Sie müssen eine Aggregatfunktion verwenden, die ausdrückt, was Sie wollen, wie min , max , avg , string_agg , array_agg , usw. oder fügen Sie die gewünschte(n) Spalte(n) zu GROUP BY hinzu .

Alternativ können Sie die Abfrage so umformulieren, dass sie DISTINCT ON verwendet und ein ORDER BY wenn Sie wirklich eine etwas willkürliche Zeile auswählen möchten, obwohl ich wirklich bezweifle, dass es möglich ist, dies über ActiveRecord auszudrücken.

Einige Datenbanken – einschließlich SQLite und MySQL – wählen einfach eine beliebige Zeile aus. Dies wird vom PostgreSQL-Team als falsch und unsicher angesehen, daher folgt PostgreSQL dem SQL-Standard und betrachtet solche Abfragen als Fehler.

Wenn Sie Folgendes haben:

col1    col2
fred    42
bob     9
fred    44
fred    99

und Sie tun:

SELECT col1, col2 FROM mytable GROUP BY col1;

dann ist es offensichtlich, dass Sie die Zeile erhalten sollten:

bob     9

aber was ist mit dem Ergebnis für fred ? Es gibt keine einzige richtige Antwort, daher weigert sich die Datenbank, solche unsicheren Abfragen auszuführen. Wenn Sie das Beste wollten col2 für jeden col1 Sie würden den max verwenden aggregiert:

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