Bienvenidos a Iseries Venezuela

Las mejores prácticas, recursos, tips, enlaces, videos y artículos para informáticos relacionados con el Iseries y el As/400 lenguajes de programación RPG, ILE RPG y SQL.

The best practices, resources, tips, links, videoes and articles for computer related to the Iseries and the As/400 languages of programming RPG, ILE RPG and SQL.

Thursday, November 5, 2009

Sql para eliminar registros duplicados
















Eliminar registros con clave duplicada de un archivo utilizando SQL.



DELETE FROM LIBRERIA1/ARCHIVO1 where RRN(F1) > (Select MIN(RRN(F2)) From LIBRERIA1/ARCHIVO1 F2 WHERE F2.CLAVE = F1.CLAVE)



Debe leerse el comando de derecha a izquierda como las escrituras árabes. En este caso comenzando con el Select.

Este comando trabaja con el Record Number (Número de registro físico) con el que trabaja el Iseries al grabar los registros en un archivo. La palabra clave es: RRN.

El comando selecciona el menor record Number entre registros del mismo archivo con claves coincidentes. F1 y F2 son artificios usados por Sql para identificar rapidamente un archivo de otro archivo. El resultado de un select es una tabla interna subconjunto del archivo original,  cuyos registros coinciden con F1 (que tambien es el archivo original)  pero seleccionando el  registro con menor Record Number. Seguidamente, el comando procede a eliminar (DELETE) del archivo original el registro duplicado con mayor Record Number.




Si te pareció interesante, reenvialo a un amigo haciendo click en el sobrecito que está al final del artículo. El conocimiento es valioso, compártelo.

Autor: Ing. Liliana Suárez

2 comments:

luis said...

No estoy muy seguro que tu código requiere ejecutar varias veces la sentencia para borrar regitros que estén repetidos más de dos veces. En mi caso, yo por lo general lo que hago es una vista, a fin de poder revisar la data primero, y después borro los registros de esa vista. Por ejemplo:

CREATE VIEW libname.viewdup AS
WITH T1 AS(
SELECT A.*, RRN(A) AS RRNO FROM lib.file A
)
SELECT * FROM T1 A WHERE EXISTS(
SELECT 1 FROM T1 B
WHERE A.CLAVE = B.CLAVE AND A.RRNO > B.RRNO );

Puedes hacer un "SELECT * FROM libname.viewdup" para revisar y, si estás de acuerdo con la selección, "DELETE FROM libname.viewdup"

Saludos,

Luis Rodriguez

L Suarez said...

Excelente tu aporte Luis, Muchas gracias,
Liliana