Ponieważ tylko PK obejmuje wszystkie kolumny tabeli bazowej w GROUP BY
klauzula. Dlatego twoje pierwsze zapytanie działa. UNIQUE
ograniczenie nie.
Kombinacja nieodroczonego UNIQUE
i NOT NULL
Ograniczenie również by się kwalifikowało. Ale to nie jest zaimplementowane — podobnie jak kilka innych zależności funkcjonalnych znanych ze standardu SQL. Peter Eisentraut, główny autor artykułu, miał więcej na myśli, ale w tamtym czasie ustalono, że popyt jest niski, a związane z nim koszty mogą być wysokie. Zobacz dyskusję na temat tej funkcji na pgsql-hackers.
Instrukcja:
Gdy GROUP BY
jest obecny lub istnieją jakiekolwiek funkcje agregujące, nie jest prawidłowy dla SELECT
listy wyrażeń odwołujących się do niezgrupowanych kolumn, z wyjątkiem funkcji agregujących lub sytuacji, gdy niezgrupowana kolumna jest funkcjonalnie zależna od zgrupowanych kolumn, ponieważ w przeciwnym razie dla niezgrupowanej kolumny mogłaby zostać zwrócona więcej niż jedna wartość. Zależność funkcjonalna istnieje, jeśli zgrupowane kolumny (lub ich podzbiór) są kluczem podstawowym tabeli zawierającej niezgrupowaną kolumnę.
I bardziej wyraźnie:
PostgreSQL rozpoznaje zależności funkcjonalne (pozwalając na pomijanie kolumn z GROUP BY
) tylko wtedy, gdy klucz podstawowy tabeli jest zawarty w GROUP BY
lista. Standard SQL określa dodatkowe warunki, które należy rozpoznać.
Od c.vin
jest UNIQUE NOT NULL
, możesz poprawić drugie zapytanie, używając zamiast tego kolumny PK:
...
group by c.id;
Poza tym, podczas gdy integralność referencyjna jest wymuszana, a cała tabela jest odpytywana, oba podane zapytania mogą być znacznie tańsze:agregowanie wierszy w appraisal
przed sprzężenie. Eliminuje to potrzebę GROUP BY
w zewnętrznym SELECT
apriorycznie. Na przykład:
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;
Zobacz:
- Wiele wywołań array_agg() w jednym zapytaniu
Powiązane:
- Oświadczenie SQL działające w MySQL nie działa w Postgresql - Sum i group_by rails 3
- PostgreSQL - klauzula GROUP BY