PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL -deve aparecer na cláusula GROUP BY ou ser usado em uma função agregada


Se user_id é a CHAVE PRIMÁRIA então você precisa atualizar o PostgreSQL; as versões mais recentes manipularão corretamente o agrupamento pela chave primária.

Se user_id não é exclusivo nem a chave primária para a relação 'estates' em questão, então esta consulta não faz muito sentido, pois o PostgreSQL não tem como saber qual valor a ser retornado para cada coluna de estates onde várias linhas compartilham o mesmo user_id . Você deve usar uma função agregada que expresse o que você deseja, como min , max , avg , string_agg , array_agg , etc ou adicione a(s) coluna(s) de interesse ao GROUP BY .

Como alternativa, você pode reformular a consulta para usar DISTINCT ON e um ORDER BY se você realmente quiser escolher uma linha um tanto arbitrária, embora eu realmente duvide que seja possível expressar isso via ActiveRecord.

Alguns bancos de dados - incluindo SQLite e MySQL - escolherão apenas uma linha arbitrária. Isso é considerado incorreto e inseguro pela equipe do PostgreSQL, então o PostgreSQL segue o padrão SQL e considera tais consultas como erros.

Se você tem:
col1    col2
fred    42
bob     9
fred    44
fred    99

e você faz:
SELECT col1, col2 FROM mytable GROUP BY col1;

então é óbvio que você deve obter a linha:
bob     9

mas e o resultado para fred ? Não há uma única resposta correta para escolher, portanto, o banco de dados se recusará a executar essas consultas inseguras. Se você queria o maior col2 para qualquer col1 você usaria o max agregar:
SELECT col1, max(col2) AS max_col2 FROM mytable GROUP BY col1;