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

Proč nemohu vyloučit závislé sloupce ze „GROUP BY“, když agreguji podle klíče?

Protože pouze PK pokrývá všechny sloupce podkladové tabulky v GROUP BY doložka. Váš první dotaz tedy funguje. UNIQUE omezení ne.

Kombinace neodložitelného UNIQUE a NOT NULL omezení by se také kvalifikovalo. Ale to není implementováno - stejně jako některé další funkční závislosti známé standardu SQL. Peter Eisentraut, hlavní autor funkce, měl na mysli více, ale v té době bylo rozhodnuto, že poptávka je nízká a související náklady mohou být vysoké. Podívejte se na diskuzi o této funkci na pgsql-hackers.

Manuál:

Když GROUP BY je přítomen nebo jsou přítomny jakékoli agregační funkce, není platný pro SELECT seznam výrazů, které odkazují na neseskupené sloupce, s výjimkou agregačních funkcí nebo když neseskupený sloupec funkčně závisí na seskupených sloupcích, protože jinak by pro neseskupený sloupec bylo možné vrátit více než jednu hodnotu. Funkční závislost existuje, pokud jsou seskupené sloupce (nebo jejich podmnožina) primárním klíčem tabulky obsahující neseskupený sloupec.

A ještě konkrétněji:

PostgreSQL rozpozná funkční závislost (umožňuje vynechat sloupce z GROUP BY ) pouze v případě, že je primární klíč tabulky obsažen v GROUP BY seznam. Standard SQL specifikuje další podmínky, které by měly být rozpoznány.

Od c.vin je UNIQUE NOT NULL , můžete svůj druhý dotaz opravit pomocí sloupce PK:

...
group by c.id;

Kromě toho, zatímco je vynucována referenční integrita a dotazuje se celá tabulka, oba uvedené dotazy mohou být podstatně levnější:agregovat řádky v appraisal před spojení. To odstraňuje potřebu GROUP BY ve vnějším SELECT a priori. Jako:

SELECT c.vin, c.color, c.brand
     , a.min_appraisal
     , a.max_appraisal
FROM   car c
LEFT   JOIN (
   SELECT car_vin
        , min(price) AS min_appraisal
        , max(price) AS max_appraisal
   FROM   appraisal
   GROUP  BY car_vin
   ) a ON a.car_vin = c.vin;

Viz:

  • Více volání array_agg() v jednom dotazu

Související:

  • Příkaz SQL fungující v MySQL nefunguje v Postgresql - Sum &group_by rails 3
  • PostgreSQL – klauzule GROUP BY



  1. MySQL, zřetězit dva sloupce

  2. Jak řešit problémy s ORA-02049 a se zámkem obecně s Oracle

  3. Jak napsat parametrizovaný dotaz na vložení Oracle?

  4. ORA-01031:nedostatečná oprávnění při výběru pohledu