traer solo repetir repetidos registros mostrar menos evitar eliminar duplicados dejando consulta agrupar sql oracle duplicate-data duplicate-removal

solo - SQL: eliminación de registros duplicados, aunque de diferente tipo



sql eliminar registros repetidos dejando solo 1 (2)

Si el orden de las columnas A y B no importa y siempre contiene un número entero, qué tal:

select distinct least(a, b) as a, greatest(a, b) as b, c from t6

Considera la siguiente tabla:

TAB6 A B C ---------- ---------- - 1 2 A 2 1 A 2 3 C 3 4 D

Considero que los registros {1,2, A} y {2, 1, A} son duplicados. Necesito seleccionar y producir el siguiente conjunto de registros:

A B C A B C ---------- ---------- - ---------- ---------- - 1 2 A or 2 1 A 2 3 C 2 3 C 3 4 D 3 4 D

Intenté las siguientes consultas. Pero fue en vano.

select t1.* from t6 t1 , t6 t2 where t1.a <> t2.b and t1.b <> t2.a and t1.rowid <> t2.rowid / A B C ---------- ---------- - 1 2 A 2 1 A 2 1 A 2 3 C 3 4 D 3 4 D 6 rows selected.

O incluso esto:

select * from t6 t1 where exists (select * from t6 t2 where t1.a <> t2.b and t1.b <> t2.a) / A B C ---------- ---------- - 1 2 A 2 1 A 2 3 C 3 4 D

Ambos no funcionaron.

La base de datos sería Oracle 10g. Buscando una solución SQL pura. Toda ayuda es apreciada.


Use las funciones MÁS GRANDES () y MENOS () para identificar los valores comunes en múltiples columnas. Luego use DISTINCT para sacar los duplicados.

select distinct least(a, b) as a , greatest(a, b) as b , c from t6

Esto le proporciona el conjunto de registros preciso que solicitó. Pero las cosas se volverán más complicadas si necesita incluir otras columnas de T6.

"Pero me preguntaba si esto también funcionaría para los campos VARCHAR2".

Sí, pero usará los valores ASCII para determinar el orden, que no siempre es lo que podría esperar (o desear).

"Además, mi tabla T6 podría tener decenas de miles de registros".

Eso realmente no es una gran cantidad de datos en términos de hoy. DISTINCT causará una clasificación, que debería poder caber en la memoria a menos que A y B sean realmente largas columnas VARCHAR2, pero probablemente incluso entonces.

Si esta es una consulta, querrá ejecutar mucho, entonces puede construir un índice basado en funciones para satisfacerla:

create index t6_fbi on t6(least(a, b) , greatest(a, b) , c ) /

Pero realmente solo me molestaría si tienes un problema de rendimiento genuino con la consulta.