I grund och botten är din fråga felaktig till att börja med. Använd UNION ALL
, inte 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.)UNION
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;
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å: