sql >> Database >  >> RDS >> PostgreSQL

Voeg een enkele kolom in een query samen met veel kolommen

Eenvoudige vraag

Dit kan veel eenvoudiger met PostgreSQL 9.1 of hoger . Zoals uitgelegd in dit nauw verwante antwoord:

  • PGError:ERROR:aggregaten niet toegestaan ​​in WHERE-clausule op een AR-query van een object en zijn has_many objecten

Het is voldoende om GROUP BY de primaire sleutel van een tafel. Sinds:

foo1 is een primaire sleutel

.. je kunt je voorbeeld vereenvoudigen tot:

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!

Query met meerdere tabellen

Maar aangezien u:

veel meer velden en LEFT JOINs, het belangrijkste is dat al deze velden een 1 op 1 of 1 op 0 relatie hebben, behalve één veld dat 1 tot n is en dat ik wil samenvoegen

.. het zou sneller en eenvoudiger moeten zijn om eerst samen te voegen, later mee te doen :

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

Op deze manier hoeft het grootste deel van uw zoekopdracht helemaal niet te worden samengevoegd.

Ik heb onlangs een testcase in een SQL Fiddle gegeven om het punt in dit gerelateerde antwoord te bewijzen:

  • PostgreSQL - rangschikken op array

Aangezien u verwijst naar dit gerelateerde antwoord:Nee, DISTINCT zal in dit geval helemaal niet helpen.



  1. Best practices voor back-ups voor MySQL, MariaDB en Galera Cluster

  2. 3 manieren om HEX naar INT te converteren in SQL Server (T-SQL)

  3. Gegevensmigraties

  4. Hoe krijg je een float-resultaat door twee integerwaarden te delen met T-SQL?