sql >> Databasteknik >  >> RDS >> PostgreSQL

Bevaras ordningen efter UNION i PostgreSQL?

I grund och botten är din fråga felaktig till att börja med. Använd UNION ALL , inte UNION eller så skulle du felaktigt ta bort dubblettposter. (Det finns inget som säger att spåret inte kan växla fram och tillbaka mellan samma e-postmeddelanden.)

Postgres-implementeringen för UNION ALL returnerar värden i den bifogade sekvensen - så länge du inte gör det lägg till ORDER BY i slutet eller gör något annat med resultatet.
Var dock medveten om att varje SELECT returnerar rader i godtycklig ordning om inte ORDER BY läggs till. Det finns ingen naturlig ordning i tabeller.

Detsamma är inte sant för UNION , som måste bearbeta alla rader för att ta bort möjliga dubbletter. Det finns olika sätt att bestämma dubbletter, den resulterande ordningen av rader beror på den valda algoritmen och är implementeringsberoende och helt opålitlig - om inte, återigen, ORDER BY läggs till.

Så använd istället:

SELECT * FROM iter1
UNION ALL  -- union all!
SELECT * FROM iter2;

För att få en tillförlitlig sorteringsordning och "simulera tillväxtrekordet" kan du spåra nivåer så här:

WITH RECURSIVE all_emails AS (
   SELECT  *, 1 AS lvl
   FROM    audit_trail
   WHERE   old_email = '[email protected]'

   UNION ALL  -- union all!
   SELECT t.*, a.lvl + 1
   FROM   all_emails  a
   JOIN   audit_trail t ON t.old_email = a.new_email
)
TABLE  all_emails
ORDER  BY lvl;

db<>fiol här
Gammal sqlfiddle

Bortsett från:if old_email är inte definierad UNIQUE på något sätt kan du få flera spår. Du skulle behöva en unik kolumn (eller kombination av kolumner) för att hålla den entydig. Om allt annat misslyckas kan du (ab-)använda det interna tupel-ID:t ctid i syfte att skilja spår åt. Men du bör hellre använda dina egna kolumner. (Lägg till exempel i fiolen.)

Tänk på:



  1. Kontrollera Oracle RAC Network och IP-information

  2. Vad är Javas JPA-teknik?

  3. Foreach Loop Container för dataflödesuppgift

  4. MySql - Hur man väljer ett antal id:n med bestämda intervall