sql >> Database teknologi >  >> RDS >> PostgreSQL

Saml en enkelt kolonne i forespørgslen med mange kolonner

Simpel forespørgsel

Dette kan være meget enklere med PostgreSQL 9.1 eller nyere . Som forklaret i dette nært beslægtede svar:

  • PGError:FEJL:aggregater er ikke tilladt i WHERE-sætning på en AR-forespørgsel af et objekt og dets har_mange objekter

Det er nok at GROUP BY den primære nøgle af et bord. Siden:

foo1 er en primær nøgle

.. du kan forenkle dit eksempel til:

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!

Forespørgsel med flere tabeller

Men da du har:

mange flere felter og LEFT JOINs, den vigtige del er, at alle disse felter har 1 til 1 eller 1 til 0 relation undtagen et felt, der er 1 til n, som jeg vil aggregere

.. det burde være hurtigere og nemmere at samle først, deltage senere :

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å denne måde behøver den store del af din forespørgsel slet ikke aggregering.

Jeg har for nylig fremlagt en testcase i en SQL Fiddle for at bevise pointen i dette relaterede svar:

  • PostgreSQL - bestil efter en matrix

Da du henviser til dette relaterede svar:Nej, DISTINCT kommer ikke til at hjælpe overhovedet i dette tilfælde.



  1. SQLiteOpenHelper:metoden onCreate() kaldes ikke på fysisk enhed

  2. PostgreSQL-streamingreplikering - et dybt dyk

  3. Hvordan får jeg en forespørgselsudførelsesplan i SQL Server?

  4. En eksplicit værdi for identitetskolonnen i tabellen kan kun angives, når der bruges en kolonneliste, og IDENTITY_INSERT er PÅ SQL Server