sql >> Databasteknik >  >> RDS >> PostgreSQL

Parallell unnest() och sorteringsordning i PostgreSQL

Ja, det är en egenskap hos Postgres och parallell odling är garanterad för att vara synkroniserad (så länge alla arrayer har samma antal element).
Postgres 9.4 lägger till en ren lösning för parallell unnest:

  • Unnesta flera arrayer parallellt

Ordningen på de resulterande raderna är dock inte garanterad. Egentligen med ett så enkelt uttalande som:

SELECT unnest(ARRAY[5,3,9]) AS id

den resulterande ordningen av rader är "garanterad", men Postgres hävdar ingenting. Frågeoptimeraren är fri att beställa rader som den vill så länge som ordningen inte är explicit definierad. Detta kan ha biverkningar i mer komplexa frågor.

Om den andra frågan i din fråga är vad du faktiskt vill ha (lägg till ett indexnummer till okapslade arrayelement), finns det ett bättre sätt med generate_subscripts() :

SELECT unnest(ARRAY[5,3,9]) AS id
     , generate_subscripts(ARRAY[5,3,9], 1) AS idx
ORDER  BY idx;

Detaljer i detta relaterade svar:

  • Hur får man åtkomst till array internt index med postgreSQL?

Du kommer att vara intresserad av WITH ORDINALITY i Postgres 9.4 :

  • PostgreSQL unnest() med elementnummer

Då kan du använda:

SELECT * FROM unnest(ARRAY[5,3,9]) WITH ORDINALITY tbl(id, idx);


  1. Millisekunder i min DateTime ändras när den lagras i SQL Server

  2. Komplett process för att kopiera tabell från en databas till en annan (export-import) i SQL Server

  3. MS Access-korruption Del 1:Vanliga orsaker

  4. Flera frågor körs i java i en enda sats