sql >> Database >  >> RDS >> PostgreSQL

Rails breidt velden uit met scope, PG vindt het niet leuk

Zoals Frank heeft uitgelegd, zal PostgreSQL elke zoekopdracht weigeren die geen reproduceerbare reeks rijen retourneert.

Stel dat u een vraag heeft als:

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

PostgreSQL zal het weigeren omdat b wordt niet gespecificeerd in de group by uitspraak. Voer dat daarentegen uit in MySQL en het wordt geaccepteerd. In het laatste geval start u echter een paar invoegingen, updates en verwijderingen, en de volgorde van de rijen op schijfpagina's wordt anders.

Als het geheugen dient, zijn de implementatiedetails zo dat MySQL daadwerkelijk sorteert op a, b en de eerste b in de set retourneert. Maar wat de SQL-standaard betreft, het gedrag is niet gespecificeerd -- en ja hoor, PostgreSQL doet dat niet sorteer altijd voordat u statistische functies uitvoert.

Dit kan mogelijk resulteren in verschillende waarden van b in resultaat ingesteld in PostgreSQL. En dus levert PostgreSQL een fout op, tenzij je specifieker bent:

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

Wat Frank benadrukte, is dat in PostgreSQL 9.1, als a is de primaire sleutel, dan kunt u b . verlaten niet gespecificeerd -- de planner heeft geleerd om opeenvolgende groepen op velden te negeren wanneer toepasselijke primaire sleutels een unieke rij impliceren.

Voor uw probleem in het bijzonder, moet u uw groep specificeren op zoals u momenteel doet, plus elk veld waarop u uw aggregaat baseert, bijv. "widgets"."id", "widgets"."user_id", [snip] maar niet dingen als sum(amount) , wat de geaggregeerde functieaanroepen zijn.

Als een off-topic kanttekening, ik weet niet zeker hoe je ORM/model werkt, maar de SQL die het genereert is niet optimaal. Veel van die left outer joins lijken binnenste joins te zijn. Dit zal ertoe leiden dat de planner, indien van toepassing, een geschikte samenvoegvolgorde kan kiezen.



  1. Kan ik een functie gebruiken voor een standaardwaarde in MySql?

  2. De auxService:mapreduce_shuffle bestaat niet

  3. Hoe de ASCII-code voor een bepaald personage te vinden in MySQL

  4. Het probleem met vensterfuncties en weergaven