sql >> Databasteknik >  >> RDS >> PostgreSQL

Aggregera en enda kolumn i frågan med många kolumner

Enkel fråga

Detta kan vara mycket enklare med PostgreSQL 9.1 eller senare . Som förklaras i detta närbesläktade svar:

  • PGError:ERROR:aggregationer är inte tillåtna i WHERE-satsen på en AR-fråga för ett objekt och dess has_many-objekt

Det räcker med att GROUP BY den primära nyckeln av ett bord. Sedan:

foo1 är en primärnyckel

.. du kan förenkla ditt exempel till:

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!

Fråga med flera tabeller

Men eftersom du har:

många fler fält och LEFT JOINs, den viktiga delen är att alla dessa fält har 1 till 1 eller 1 till 0 relation förutom ett fält som är 1 till n som jag vill aggregera

.. det borde vara snabbare och enklare att samla först, gå med senare :

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 ...

På så sätt behöver inte den stora delen av din fråga aggregeras alls.

Jag gav nyligen ett testfall i en SQL Fiddle för att bevisa poängen i detta relaterade svar:

  • PostgreSQL - ordna efter en array

Eftersom du syftar på detta relaterade svar:Nej, DISTINCT kommer inte att hjälpa alls i det här fallet.



  1. Hur ersätter man specifika värden i en Oracle-databaskolumn?

  2. T-sql - bestäm om värdet är heltal

  3. Hur funktionen EXPORT_SET() fungerar i MySQL

  4. Genomgång:Konfigurera SQL Server High Availability