Тъй като само PK покрива всички колони на основната таблица в GROUP BY
клауза. Следователно първата ви заявка работи. UNIQUE
ограничението не.
Комбинацията от неотложим UNIQUE
и NOT NULL
ограничението също би отговаряло на изискванията. Но това не е внедрено - както и някои други функционални зависимости, известни на SQL стандарта. Питър Айзентраут, главният автор на функцията, имаше предвид повече, но по това време беше определено, че търсенето е ниско и свързаните с това разходи може да са високи. Вижте дискусията за функцията на pgsql-hackers.
Ръководството:
Когато
GROUP BY
е налице или има агрегатни функции, не е валидно заSELECT
списъчни изрази, които да се отнасят до негрупирани колони, освен в рамките на агрегатни функции или когато негрупираната колона е функционално зависима от групираните колони, тъй като в противен случай би имало повече от една възможна стойност за връщане за негрупирана колона. Съществува функционална зависимост, ако групираните колони (или подмножество от тях) са първичният ключ на таблицата, съдържаща негрупираната колона.
И по-ясно:
PostgreSQL разпознава функционална зависимост (позволявайки колони да бъдат пропуснати от
GROUP BY
) само когато първичният ключ на таблицата е включен вGROUP BY
списък. SQL стандартът определя допълнителни условия, които трябва да бъдат разпознати.
Тъй като c.vin
е UNIQUE NOT NULL
, можете да коригирате втората си заявка, като вместо това използвате колоната PK:
...
group by c.id;
Освен това, докато референтната цялост е наложена и цялата таблица е заявена, и двете дадени заявки могат да бъдат значително по-евтини:обобщени редове в appraisal
преди присъединяването. Това премахва необходимостта от GROUP BY
във външния SELECT
априори. Като:
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;
Вижте:
- Множество извиквания на array_agg() в една заявка
Свързано:
- SQL оператор, работещ в MySQL, не работещ в Postgresql - Sum &group_by rails 3
- PostgreSQL – клауза GROUP BY