SQL Server - Eliminar Registro duplicado . . .

 
Vista:

Eliminar Registro duplicado . . .

Publicado por eduardoc (2 intervenciones) el 14/08/2012 01:01:01
Estimados,
Trabajo con Power Builder 11.5.

Mediante un cursor leo una tabla y quiero eliminar un registro duplicado, como hago
el delete para identificar el duplicado ya que ambos tienen todos los valores de los campos
iguales y si le hago

delete Tabla from campo = :Valor ;

me eliminara los dos registros ( el original y el duplicado) ,ya que ambos son similares . . .

Existe una manera de saber el numero de registro dentro de la tabla , si es asi
podría decir

delete from Tabla where 'Numero de Registro ' = 'Numero' ; y se soluciona el problema

o si por ahi tienen otra solucion,

Se me ocurre colocarlo en un dw y alli si sabria el nro. de registro por el dw_1.getrow() , pero por codigo sql se puede hacer ??

Gracias de antemano

Saludos desde Lima - Perú...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Eliminar Registro duplicado . . .

Publicado por Isaias (4558 intervenciones) el 14/08/2012 16:46:34
¿Que motor de base de datos manejas?, si fuera SQL Server, dinos que Version-Edicion tienes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar Registro duplicado . . .

Publicado por CON-DITO (1 intervención) el 31/10/2012 17:38:33
PAra ello puedes utilizar un TOP con valor 1 de esta forma solo te eliminara una fila de las que encuentre. Sería algo así:

DELETE TOP(1)
FROM TABLA_IDS
WHERE (ID1 = 643759 )

Esto no es gratis, la solución a tu duda cuesta 100 € , eso sin el desplazamiento.. de mis dedos al teclado. Pongase en contacto conmigo a la sigueinte direccion..jaja.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Eliminar Registro duplicado . . .

Publicado por Luis Hilario (1 intervención) el 02/06/2015 18:13:11
muy buena solucion, gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar Registro duplicado . . .

Publicado por Wilson Yadir Acuña (1 intervención) el 10/10/2017 15:43:47
Para eliminar registros duplicados de una tabla , podemos utilizar la expresión de SQl server

1
2
3
4
5
6
7
8
WITH common_table_expression;
 
[ WITH <common_table_expression> [ ,...n ] ]
 
<common_table_expression>::=
        expression_name [ ( column_name [ ,...n ] ) ]
    AS
        ( CTE_query_definition )


Para mostrar mejor el caso, realizaremos el siguiente caso.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
create table personal
(
id int,
cedula varchar(18),
nombres  varchar(50),
apellidos varchar(50),
Tel varchar(12),
fec_nac  smalldatetime,
genero varchar(1)
)
set dateformat ymd
 
insert into personal values (1,'11115678','nombre 1', 'apellido 1','111111','20000111','m')
insert into personal values (2,'22225678','nombre 2', 'apellido 2','222222','20000222','f')
insert into personal values (3,'33335678','nombre 3', 'apellido 3','333333','20000311','m')
insert into personal values (4,'44445678','nombre 4', 'apellido 4','444444','20000422','f')
insert into personal values (5,'55555678','nombre 5', 'apellido 5','555555','20000511','m')
-- otra vez
insert into personal values (5,'11115678','nombre 1', 'apellido 1','111111','20000111','m')
insert into personal values (6,'22225678','nombre 2', 'apellido 2','222222','20000222','f')
insert into personal values (7,'33335678','nombre 3', 'apellido 3','333333','20000311','m')
insert into personal values (8,'44445678','nombre 4', 'apellido 4','444444','20000422','f')
insert into personal values (9,'55555678','nombre 5', 'apellido 5','555555','20000511','m')
-- otra vez
insert into personal values (10,'11115678','nombre 1', 'apellido 1','111111','20000111','m')
insert into personal values (11,'22225678','nombre 2', 'apellido 2','222222','20000222','f')
insert into personal values (12,'33335678','nombre 3', 'apellido 3','333333','20000311','m')
insert into personal values (13,'44445678','nombre 4', 'apellido 4','444444','20000422','f')
insert into personal values (14,'55555678','nombre 5', 'apellido 5','555555','20000511','m')

select * from personal

id cedula nombres apellidos Tel fec_nac genero
-- ----------------- ------------- ------------ ------------ ---------------------------- -
1 11115678 nombre 1 apellido 1 111111 2000-01-11 00:00:00 m
2 22225678 nombre 2 apellido 2 222222 2000-02-22 00:00:00 f
3 33335678 nombre 3 apellido 3 333333 2000-03-11 00:00:00 m
4 44445678 nombre 4 apellido 4 444444 2000-04-22 00:00:00 f
5 55555678 nombre 5 apellido 5 555555 2000-05-11 00:00:00 m
5 11115678 nombre 1 apellido 1 111111 2000-01-11 00:00:00 m
6 22225678 nombre 2 apellido 2 222222 2000-02-22 00:00:00 f
7 33335678 nombre 3 apellido 3 333333 2000-03-11 00:00:00 m
8 44445678 nombre 4 apellido 4 444444 2000-04-22 00:00:00 f
9 55555678 nombre 5 apellido 5 555555 2000-05-11 00:00:00 m
10 11115678 nombre 1 apellido 1 111111 2000-01-11 00:00:00 m
11 22225678 nombre 2 apellido 2 222222 2000-02-22 00:00:00 f
12 33335678 nombre 3 apellido 3 333333 2000-03-11 00:00:00 m
13 44445678 nombre 4 apellido 4 444444 2000-04-22 00:00:00 f
14 55555678 nombre 5 apellido 5 555555 2000-05-11 00:00:00 m

select cedula ,COUNT(*)
from personal
group by cedula

cedula (No column name)
11115678 3
22225678 3
33335678 3
44445678 3
55555678 3

Realizamos una consulta que nos permita enumerar las veces que esta repetida la cédula

1
2
3
4
5
6
SELECT
	ROW_NUMBER() OVER(PARTITION BY cedula ORDER BY cedula) AS Fila
	,*
	FROM personal a
	WHERE a.cedula  IN (SELECT DISTINCT cedula
				FROM personal)

observamos el resultado:

Fila id cedula nombres apellidos Tel fec_nac genero
1 1 11115678 nombre 1 apellido 1 111111 2000-01-11 00:00:00 m
2 5 11115678 nombre 1 apellido 1 111111 2000-01-11 00:00:00 m
3 10 11115678 nombre 1 apellido 1 111111 2000-01-11 00:00:00 m
1 11 22225678 nombre 2 apellido 2 222222 2000-02-22 00:00:00 f
2 6 22225678 nombre 2 apellido 2 222222 2000-02-22 00:00:00 f
3 2 22225678 nombre 2 apellido 2 222222 2000-02-22 00:00:00 f
1 3 33335678 nombre 3 apellido 3 333333 2000-03-11 00:00:00 m
2 7 33335678 nombre 3 apellido 3 333333 2000-03-11 00:00:00 m
3 12 33335678 nombre 3 apellido 3 333333 2000-03-11 00:00:00 m
1 13 44445678 nombre 4 apellido 4 444444 2000-04-22 00:00:00 f
2 8 44445678 nombre 4 apellido 4 444444 2000-04-22 00:00:00 f
3 4 44445678 nombre 4 apellido 4 444444 2000-04-22 00:00:00 f
1 5 55555678 nombre 5 apellido 5 555555 2000-05-11 00:00:00 m
2 9 55555678 nombre 5 apellido 5 555555 2000-05-11 00:00:00 m
3 14 55555678 nombre 5 apellido 5 555555 2000-05-11 00:00:00 m

Identificamos que el campo fila queda el número del registro, todos los registros estan repetidos tres (3) veces

Ahora utilizamos la expresión WITH common_table_expression;


1
2
3
4
5
6
7
8
9
10
11
12
WITH
Filas AS
(
	SELECT
	ROW_NUMBER() OVER(PARTITION BY cedula ORDER BY cedula) AS Fila
	,*
	FROM personal a
	WHERE a.cedula  IN (SELECT DISTINCT cedula
				FROM personal)
)
DELETE FROM Filas
WHERE Fila > 1

y ejecutamos nuevamente la instrucción:

select cedula ,COUNT(*)
from personal
group by cedula

Observamos que ha eliminado los registros duplicados

cedula (No column name)
11115678 1
22225678 1
33335678 1
44445678 1
55555678 1


Espero les sirva, hasta la próxima!.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Eliminar Registro duplicado . . .

Publicado por Aldo Clx (1 intervención) el 23/10/2017 18:32:31
Probé el código y funciona perfectamente. Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar Registro duplicado . . .

Publicado por Secoco (1 intervención) el 31/01/2020 22:51:50
muy buena el aporte me sirvio....gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar