PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Защо не мога да изключа зависими колони от „GROUP BY“, когато агрегирам по ключ?

Тъй като само 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql агрегатен масив

  2. Как да инсталирам postgres с NSIS с всички параметри?

  3. PostgreSQL 9.6:Паралелно последователно сканиране

  4. Как да върнете списък с налични съпоставяния в PostgreSQL

  5. Как да направя заявка за всички редове в радиус от 5 мили от моите координати?