sql >> Databáze >  >> RDS >> PostgreSQL

Agregovat funkce na více spojených tabulkách

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;

Vytváří požadovaný výsledek.

  • Přepište pomocí explicitního JOIN syntax. Je to mnohem snazší číst a pochopit (a ladit).

  • Připojením k více 1:n související tabulky, řádky by se navzájem násobily a vytvořily by kartézský produkt - což je velmi drahý nesmysl. Je to nechtěné CROSS JOIN přes proxy. Související:

  • Chcete-li se tomu vyhnout, připojte se nejvýše k jednému n -tabulka na 1 -table před agregací (GROUP BY ). Můžete agregovat dvakrát, ale je čistší a rychlejší agregovat n -tabulky samostatně před jejich připojením k 1 -stůl.

  • Na rozdíl od vašeho originálu (s implicitním INNER JOIN ). Používám LEFT JOIN aby nedošlo ke ztrátě řádků z foo které nemají žádný odpovídající řádek v foo_bar nebo tag .

  • Jakmile dojde k nechtěnému CROSS JOIN je z dotazu odstraněn, není třeba přidávat DISTINCT nic víc - za předpokladu, že foo.id je jedinečný.




  1. Je možné vyhledat celé zadané slovo ve Fulltextovém vyhledávání mysql

  2. Vrátit parametry uložené procedury nebo uživatelem definované funkce na serveru SQL (příklady T-SQL)

  3. Rozdíl implicitní konverze datového toku CAST vs ssis

  4. Jak automaticky přidat 1 rok datum k existujícímu datu na SQL Server