PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Обединете една колона в заявка с много колони

Проста заявка

Това може да е много по-просто с PostgreSQL 9.1 или по-нова версия . Както е обяснено в този тясно свързан отговор:

  • PGError:ГРЕШКА:агрегатите не са разрешени в клаузата WHERE на AR заявка на обект и неговите has_many обекти

Достатъчно е да GROUP BY първичния ключ на маса. Тъй като:

foo1 е първичен ключ

.. можете да опростите примера си до:

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!

Заявка с множество таблици

Въпреки това, тъй като имате:

много повече полета и LEFT JOIN, важната част е, че всички тези полета имат връзка 1 към 1 или 1 към 0 с изключение на едно поле, което е от 1 до n, което искам да обединя

.. трябва да е по-бързо и по-лесно заобединяване първо, присъединяване по-късно :

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

По този начин голямата част от вашата заявка изобщо не се нуждае от агрегиране.

Наскоро предоставих тестов случай в SQL Fiddle, за да докажа смисъла на този свързан отговор:

  • PostgreSQL – подреждане по масив

Тъй като имате предвид този свързан отговор:Не, DISTINCT няма да помогне изобщо в този случай.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pandas записване на рамка от данни в друга postgresql схема

  2. Създайте postgres docker контейнер с първоначална схема

  3. Уникално поле на модела в Django и чувствителност към малки и големи букви (postgres)

  4. PostgreSQL имена на процеси в Solaris

  5. Групиране по интервали от данни