sql >> Base de Datos >  >> RDS >> PostgreSQL

Agregue una sola columna en la consulta con muchas columnas

Consulta sencilla

Esto puede ser mucho más simple con PostgreSQL 9.1 o posterior . Como se explica en esta respuesta estrechamente relacionada:

  • PGError:ERROR:agregados no permitidos en la cláusula WHERE en una consulta AR de un objeto y sus objetos has_many

Basta con GROUP BY la clave principal de una mesa Desde:

foo1 es una clave principal

.. puedes simplificar tu ejemplo a:

SELECT foo1, foo2, foo3, foo4, foo5, foo6, string_agg(aggregated_field, ', ')
FROM   tbl1
GROUP  BY 1
ORDER  BY foo7, foo8;  -- have to be spelled out, since not in select list!

Consulta con varias tablas

Sin embargo, dado que tiene:

muchos más campos y LEFT JOIN, la parte importante es que todos estos campos tienen una relación de 1 a 1 o de 1 a 0 excepto un campo que es de 1 a n que quiero agregar

.. debería ser más rápido y sencillo agregar primero, unirse después :

SELECT t1.foo1, t1.foo2, ...
     , t2.bar1, t2.bar2, ...
     , a.aggregated_col 
FROM   tbl1 t1
LEFT   JOIN tbl2 t2 ON ...
...
LEFT   JOIN (
   SELECT some_id, string_agg(agg_col, ', ') AS aggregated_col
   FROM   agg_tbl a ON ...
   GROUP  BY some_id
   ) a ON a.some_id = ?.some_id
ORDER  BY ...

De esta manera, la gran parte de su consulta no necesita agregación en absoluto.

Recientemente proporcioné un caso de prueba en un SQL Fiddle para probar el punto en esta respuesta relacionada:

  • PostgreSQL:ordenar por matriz

Ya que te refieres a esta respuesta relacionada:No, DISTINCT no va a ayudar en absoluto en este caso.