PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL — musi występować w klauzuli GROUP BY lub być używany w funkcji agregującej

Jeśli user_id to KLUCZ PODSTAWOWY musisz zaktualizować PostgreSQL; nowsze wersje poprawnie obsłużą grupowanie według klucza podstawowego.

Jeśli user_id nie jest ani unikalny ani kluczem podstawowym dla danej relacji „posiadłości”, to zapytanie nie ma większego sensu, ponieważ PostgreSQL nie ma sposobu, aby dowiedzieć się, który wartość do zwrócenia dla każdej kolumny estates gdzie wiele wierszy ma ten sam user_id . Musisz użyć funkcji agregującej, która wyraża to, czego chcesz, np. min , max , avg , string_agg , array_agg , itp. lub dodaj interesujące kolumny do GROUP BY .

Alternatywnie możesz przeformułować zapytanie, aby użyć DISTINCT ON oraz ORDER BY jeśli naprawdę chcesz wybrać nieco arbitralny wiersz, chociaż naprawdę wątpię, czy można to wyrazić za pomocą ActiveRecord.

Niektóre bazy danych — w tym SQLite i MySQL — po prostu wybierają dowolny wiersz. Jest to uważane za nieprawidłowe i niebezpieczne przez zespół PostgreSQL, więc PostgreSQL stosuje się do standardu SQL i uważa takie zapytania za błędy.

Jeśli masz:

col1    col2
fred    42
bob     9
fred    44
fred    99

a ty robisz:

SELECT col1, col2 FROM mytable GROUP BY col1;

wtedy oczywiste jest, że powinieneś otrzymać wiersz:

bob     9

ale co z wynikiem dla fred ? Nie ma jednej poprawnej odpowiedzi do wybrania, więc baza danych odmówi wykonania takich niebezpiecznych zapytań. Jeśli chciałeś najwspanialszego col2 dla każdego col1 użyjesz max agregat:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zmienić domyślną wartość kolumny w PostgreSQL?

  2. Pisanie do określonych schematów za pomocą RPostgreSQL

  3. Lista przechowywanych funkcji, które odwołują się do tabeli w PostgreSQL

  4. Jak AT TIME ZONE działa w PostgreSQL

  5. Jak pisać wielką literą każdego słowa w PostgreSQL