Eu tenho duas tabelas employee
e phones
. Um funcionário pode ter de 0 a n números de telefone. Quero listar os nomes dos funcionários com seus números de telefone. Estou usando a consulta abaixo que funciona bem.
SELECT empname,array_agg(phonenumber) AS phonenumbers
FROM employee LEFT OUTER JOIN phones ON employee.empid = phones.empid
GROUP BY employee.empid
A tabela de funcionários pode conter um grande número de linhas. Quero buscar apenas alguns funcionários de cada vez. Por exemplo, quero buscar 3 funcionários com seus números de telefone. Estou tentando executar esta consulta.
SELECT empname,array_agg(phonenumber) AS phonenumbers
FROM
(SELECT * FROM employee ORDER BY empname LIMIT 3 OFFSET 0) AS employee
LEFT OUTER JOIN phones ON employee.empid = phones.empid
GROUP BY employee.empid
Mas eu recebo esse erro. ERROR: column "employee.empname" must appear in the GROUP BY clause or be used in an aggregate function
A única diferença entre duas consultas é que estou usando a subconsulta na última para limitar as linhas antes de ingressar. Como resolvo esse erro?
O recurso do Postgres de poder usar a chave primária de uma tabela com
GROUP BY
e não precisar adicionar as demais colunas dessa tabela naGROUP BY
cláusula é relativamente novo e funciona apenas para tabelas base. O otimizador não é (ainda?) inteligente o suficiente para identificar chaves primárias para visualizações, ctes ou tabelas derivadas (como no seu caso).Você pode adicionar as colunas que deseja na
SELECT
cláusulaGROUP BY
:ou use uma subconsulta (e transfira para
GROUP BY
lá):que também pode ser escrito como:
Desde que você esteja na versão 9.3+. você também pode usar uma
LATERAL
junção :