sql: obtiene filas únicas de dos tablas, pero mantiene duplicados de la misma tabla

CorePress2024-01-24  10

Quiero dividir una tabla en dos tablas (o más, pero digamos dos).

table_original
id column1 column2
 1   1        2
 2   1        3
 3   1        4
 4   1        4
 5   1        5

También podemos asumir que id es un identificador único. Ahora divido esta tabla en dos, usando CREATE TABLE table1 AS SELECT * FROM table_original WHERE column2 <= 4 y CREATE TABLE table2 AS SELECT * FROM table_original WHERE column2 >= 4. Ahora tengo estas dos tablas:

table1
id column1 column2
 1   1        2
 2   1        3
 3   1        4
 4   1        4
table2
id column1 column2
 3   1        4
 4   1        4
 5   1        5

¿Cómo obtener de esas dos tablas los mismos resultados que puedo obtener de la tabla original? Si ejecuto una consulta SELECT * FROM table1 UNION SELECT * FROM table2 será lo mismo que SELECT * FROM table_original debido al valor de identificación único, sin embargo, si ejecuto una consulta SELECT column1, column2 FROM table1 UNION SELECT column1, column2 FROM table2 devuelve:

column1, column2
   1        2
   1        3
   1        4
   1        5

que no es lo mismo queSELECCIONE columna1, columna2 DE table_original, que devuelve:

column1, column2
   1        2
   1        3
   1        4
   1        4
   1        5

Se eliminan los duplicados de la misma tabla. Sin embargo, si quisiera, digamos, contar los duplicados, los resultados serán diferentes, lo cual es malo. Entonces, ¿hay alguna manera de realizar una operación de tipo UNION pero mantener los duplicados que se encuentran en la misma tabla?



------------------------------------

La UNION en filas enteras en su solución será tremendamente costosa para tablas grandes (y filas anchas). Y falla rotundamente con cualquier tipo de columna que no admita el operador de igualdad (como json). Ver:

UNION ALL en tipo de datos JSON

Esta consulta es sustancialmente más rápida, lo que nos hacee del índice único en la tabla1 (id). (¡Crea ese índice si no lo tienes!)

SELECT column1, column2
FROM   table1  -- bigger table first to micro-optimize some more

UNION ALL 
SELECT column1, column2
FROM   table2 t2
WHERE  NOT EXISTS (SELECT FROM table1 WHERE id = t2.id)

Ver:

Seleccione filas que no están presentes en otra tabla

Acerca de UNION ALL (en lugar de solo UNION):

¿Se conserva el orden después de UNION en PostgreSQL? Combinando 3 declaraciones SELECT para generar 1 tabla

La pregunta sigue siendo: ¿Por qué se mantienen filas completamente duplicadas en varias tablas?

2

Gracias por la consulta optimizada y los enlaces útiles. Es solo un proyecto que estoy probando, donde es posible que de 1 mesa n taSe crearán archivos que también pueden tener algunos datos duplicados. Sin embargo, la consulta SELECT debería obtener los mismos resultados que si fuera dirigida a la tabla original.

- John Trevor

28/03/2021 a las 18:16

@John: ¿Eliminar filas duplicadas una vez?

- Erwin Brandstetter

28/03/2021 a las 23:44



------------------------------------

No estoy seguro de qué intentas lograr, pero necesitas usar union all:

SELECT column1, column2 FROM table1 
UNION ALL 
SELECT column1, column2 FROM table2

unión todos mantienens los duplicados

2

Esto devuelve 4x de los valores de columna1 y columna2 de (1,4), que no es lo mismo que si consultara la tabla original.

- John Trevor

26/03/2021 a las 21:18

1

devuelve lo que esté en ambas tablas, por lo que debes mirar en tu tabla1 y tabla2

- eshirvana

26/03/2021 a las 21:23



------------------------------------

He descubierto la respuesta.

Para mantener los duplicados encontrados en la misma tabla, pero eliminar todo lo demás, utilicé una consulta SELECT column1, column2 FROM (SELECT * FROM table1 UNION SELECT * FROM table2) AS t;

De esta manera, UNION utiliza los valores de identificación únicos para eliminar duplicados reales y luego simplemente filtro el resultado para obtener las columnas que necesito.

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare