sql >> Databasteknik >  >> RDS >> PostgreSQL

Räls expanderar fält med räckvidd, PG gillar det inte

Som Frank förklarade kommer PostgreSQL att avvisa alla frågor som inte returnerar en reproducerbar uppsättning rader.

Anta att du har en fråga som:

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

PostgreSQL kommer att avvisa det eftersom b lämnas ospecificerad i group by påstående. Kör det i MySQL, däremot, så kommer det att accepteras. I det senare fallet aktiverar du dock några insättningar, uppdateringar och borttagningar, och ordningen på raderna på disksidorna blir annorlunda.

Om minnet fungerar är implementeringsdetaljer så att MySQL faktiskt kommer att sortera efter a, b och returnera det första b i uppsättningen. Men när det gäller SQL-standarden är beteendet ospecificerat -- och visst gör PostgreSQL det inte sortera alltid innan du kör aggregerade funktioner.

Potentiellt kan detta resultera i olika värden på b i resultatuppsättning i PostgreSQL. Och därför ger PostgreSQL ett fel om du inte är mer specifik:

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

Vad Frank lyfte fram är att i PostgreSQL 9.1, om a är den primära nyckeln, än du kan lämna b ospecificerat -- planeraren har fått lära sig att ignorera efterföljande grupp efter fält när tillämpliga primärnycklar innebär en unik rad.

För ditt problem i synnerhet, måste du specificera din grupp med som du gör för närvarande, plus varje fält som du baserar ditt aggregat på, t.ex. "widgets"."id", "widgets"."user_id", [snip] men inte saker som sum(amount) , som är de aggregerade funktionsanropen.

Som en sidoanteckning utanför ämnet, jag är inte säker på hur din ORM/modell fungerar, men den SQL som den genererar är inte optimal. Många av de lämnade yttre sammanfogningarna verkar som om de borde vara inre sammanfogningar. Detta kommer att resultera i att planeraren kan välja en lämplig kopplingsorder där så är tillämpligt.



  1. Åtkomst till MySQL-databasen från mitt VB.NET 2008-projekt

  2. Hur ROW_NUMBER() fungerar i SQL Server

  3. SQL Server Internals:Plan Caching Pt. I – Återanvändning av planer

  4. Hur man installerar mysqlDb för MySQL och Python på Windows