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ý proSELECT
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 vGROUP 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