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

Агрегирани функции на множество обединени таблици

SELECT f.id, f.name, b.fb_ct, t.tag_names
FROM   foo f
LEFT JOIN  (
    SELECT foo_id AS id, count(*) AS fb_ct
    FROM   foo_bar
    GROUP  BY 1
    ) b USING (id)
LEFT JOIN  (
    SELECT target_id AS id, array_agg(name) AS tag_names
    FROM   tag
    GROUP  BY 1
    ) t USING (id)
ORDER  BY f.id;

Дава желания резултат.

  • Пренапишете с изричен JOIN синтаксис. Прави го много по-лесно за четене и разбиране (и отстраняване на грешки).

  • Чрез присъединяване към множество 1:n свързани таблици, редовете ще се умножават взаимно, създавайки декартово произведение - което е много скъпа глупост. Това е нежелано CROSS JOIN чрез пълномощник. Свързани:

  • За да избегнете това, присъединете се към най-много един n -таблица към 1 -таблица, преди да обобщите (GROUP BY ). Можете да обобщите два пъти, но е по-чисто и по-бързо да обобщите n -таблици отделно преди присъединявайки ги към 1 - маса.

  • За разлика от вашия оригинал (с имплицитно INNER JOIN ). Използвам LEFT JOIN за да избегнете загуба на редове от foo които нямат съответстващ ред в foo_bar или tag .

  • След нежеланото CROSS JOIN е премахнат от заявката, няма нужда от добавяне на DISTINCT повече - ако приемем, че foo.id е уникален.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Докато изпълнявате PITR, възможно ли е да се постави на пауза/възобновяване в PostgreSQL?

  2. plpgsql функцията, която връща множество колони, се извиква многократно

  3. Как да разделя ред на много редове в postgresql

  4. Hibernate 3.6.10 не изтрива каскадно чрез OneToMany JoinTable

  5. Стойност по подразбиране в колона при вмъкване на нов ред