PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Funkcje agregujące na wielu połączonych tabelach

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;

Daje pożądany rezultat.

  • Przepisz z jawnym JOIN składnia. Znacznie ułatwia czytanie i zrozumienie (i debugowanie).

  • Łącząc się z wieloma 1:n powiązanych tabel, wiersze mnożą się nawzajem, tworząc produkt kartezjański - co jest bardzo kosztownym nonsensem. To niezamierzone CROSS JOIN przez pełnomocnika. Powiązane:

  • Aby tego uniknąć, dołącz co najwyżej do jednego n -table do 1 -table przed agregacją (GROUP BY ). Możesz agregować dwa razy, ale agregacja n jest czystsza i szybsza -tabele oddzielnie przed dołączanie ich do 1 -stół.

  • W przeciwieństwie do oryginału (z niejawnym INNER JOIN ). Używam LEFT JOIN aby uniknąć utraty wierszy z foo które nie mają pasującego wiersza w foo_bar lub tag .

  • Po niezamierzonym CROSS JOIN zostanie usunięty z zapytania, nie ma potrzeby dodawania DISTINCT więcej - zakładając, że foo.id jest wyjątkowy.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jakie są dostępne opcje identyfikacji i usuwania nieprawidłowych obiektów w Postgresie (np. uszkodzone indeksy)

  2. Tabele danych — dane wyjściowe Json — PostgreSQL — zwraca wartość null

  3. Relacja JPA wiele-do-wielu powodująca nieskończoną rekurencję i błąd przepełnienia stosu

  4. * Nierozpoznane pole pod adresem:baza danych Czy chodziło Ci o:- metryki - serwer - logowanie - DROPWIZARD

  5. Rails ActiveRecord:Jak używać zmiennych bind z podwójnymi cudzysłowami w jsonb?