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

Rails разширяващи полета с обхват, PG не го харесва

Както Франк обясни, PostgreSQL ще отхвърли всяка заявка, която не връща възпроизводим набор от редове.

Да предположим, че имате запитване като:

select a, b, agg(c)
from tbl
group by a

PostgreSQL ще го отхвърли, защото b е оставен неуточнен в group by изявление. Изпълнете това в MySQL, за разлика от това, и ще бъде прието. В последния случай обаче задействайте няколко вмъквания, актуализации и изтривания и редът на редовете на страниците на диска в крайна сметка е различен.

Ако паметта не ме лъже, подробностите за изпълнението са така, че MySQL действително ще сортира по a, b и ще върне първото b в набора. Но що се отнася до SQL стандарта, поведението е неуточнено -- и със сигурност PostgreSQL не винаги сортирайте, преди да стартирате агрегатни функции.

Потенциално това може да доведе до различни стойности на b в набор от резултати в PostgreSQL. И по този начин PostgreSQL дава грешка, освен ако не сте по-конкретни:

select a, b, agg(c)
from tbl
group by a, b

Това, което Франк подчерта е, че в PostgreSQL 9.1, ако a е първичният ключ, след което можете да оставите b неуточнено -- планиращият е научен да игнорира последваща група по полета, когато приложимите първични ключове предполагат уникален ред.

Конкретно за вашия проблем трябва да посочите групата си, както правите в момента, плюс всяко поле, върху което базирате агрегата си, т.е. "widgets"."id", "widgets"."user_id", [snip] но не и неща като sum(amount) , които са обобщените извиквания на функции.

Като странична бележка извън темата, не съм сигурен как работи вашият ORM/модел, но SQL, който генерира, не е оптимален. Много от тези леви външни съединения изглеждат така, сякаш трябва да са вътрешни съединения. Това ще позволи на планиращия да избере подходящ ред на присъединяване, където е приложимо.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разлика между текст и varchar (променлив символ)

  2. Преглеждайте клиентите на 12-месечна база и проверете дали клиентът не е поръчвал през последните 12 месеца

  3. Как да използвате SQL прозоречна функция за изчисляване на процент от агрегат

  4. Оптимизирайте бавните агрегати в LATERAL съединение

  5. JPA 2.1 StoredProcedureQuery с PostgreSQL и REF_CURSORs