sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Se conserva el orden después de UNION en PostgreSQL?

Básicamente, su consulta es incorrecta para empezar. Usa UNION ALL , no UNION o eliminaría incorrectamente las entradas duplicadas. (No hay nada que diga que el rastro no puede alternar entre los mismos correos electrónicos).

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: