Básicamente, su consulta es incorrecta para empezar. Usa UNION ALL
, no o eliminaría incorrectamente las entradas duplicadas. (No hay nada que diga que el rastro no puede alternar entre los mismos correos electrónicos).UNION
La implementación de Postgres para UNION ALL
devuelve valores en la secuencia adjunta, siempre que no agregar ORDER BY
al final o hacer cualquier otra cosa con el resultado.
Sin embargo, tenga en cuenta que cada SELECT
devuelve filas en orden arbitrario a menos que ORDER BY
se adjunta. No existe un orden natural en las tablas.
Lo mismo es no verdadero para UNION
, que tiene que procesar todas las filas para eliminar posibles duplicados. Hay varias formas de determinar los duplicados, el orden resultante de las filas depende del algoritmo elegido y depende de la implementación y es completamente poco confiable, a menos que, de nuevo, ORDER BY
se adjunta.
Así que usa en su lugar:
SELECT * FROM iter1
UNION ALL -- union all!
SELECT * FROM iter2;
Para obtener un orden de clasificación confiable y "simular el registro de crecimiento", puede rastrear niveles como este:
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<>fiddle aquí
Antiguo sqlfiddle
Aparte:si old_email
no está definido UNIQUE
de alguna manera, puedes obtener múltiples senderos. Necesitaría una columna única (o una combinación de columnas) para mantenerla sin ambigüedades. Si todo lo demás falla, puede (ab-) usar la ID de tupla interna ctid
con el propósito de diferenciar los senderos. Pero debería usar sus propias columnas. (Ejemplo añadido en el violín.)
Considere: