SQL - Como modificar/eliminar la primera línea de dos líneas iguales

 
Vista:

Como modificar/eliminar la primera línea de dos líneas iguales

Publicado por Quelot (1 intervención) el 16/09/2011 11:48:31
Necesito alguna forma de modificar o eliminar una línea, pero sólo la primera que encuentre la sentencia ya que por un error del software duplica las líneas de la base de datos y no hay forma de distinguirlas, son exactamente iguales.

He probado con un UPDATE TOP 1 tabla SET campo=valor...
o bien UPDATE table SET campo=valor FROM Tabla INNER JOIN (SELECT campo FROM tabla) as Tabla 2 on tabla.campo=tabla2.campo

Pero no hay forma.
Lo unico que puedo hacer és borrar las líneas e introducir la línea buena de nuevo.

Gracias de antemano!!
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Como modificar/eliminar la primera línea de dos líneas iguales

Publicado por leonardo_josue (1173 intervenciones) el 19/09/2011 21:45:42
Hola Quelot:

Lo que pretendes hacer creo que no vas a conseguirlo con una simple instrucción INSERT o UPDATE, por lo que es posible que tengas que utilizar una tabla temporal para poder diferenciar un registro de otro.

No mencionas qué BD estás utilizando, pero por la sintaxis puedo suponer que se trata de SQL Server... aquí está un procedimiento que podrías seguir para eliminar los registros duplicados.

Paso 1. ANTES DE BORRAR REGISTROS RESPALDA TU TABLA O TU BD, por si borraras algo de más.

Paso 2. CREAR UNA TABLA TEMPORAL, con un select * de todos tus campos y agregando una columna para numerar los registros, utilizando la función ROW_NUMBER, de tal manera que cuando encuentre duplicados les ponga un índice mayor a uno:

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
30
31
32
33
34
35
declare @tabla table (campo1 int, campo2 varchar(10))
insert into @tabla values (1, 'uno')
insert into @tabla values (1, 'uno')
insert into @tabla values (2, 'dos')
insert into @tabla values (2, 'dos')
insert into @tabla values (2, 'dos')
insert into @tabla values (3, 'tres')
 
select * from @tabla
 
/*
campo1      campo2
----------- ----------
1           uno
1           uno
2           dos
2           dos
2           dos
3           tres
*/
 
select t.*,
row_number()over (partition by campo1, campo2 order by campo1, campo2) total
from @tabla t
 
/*
campo1      campo2     total
----------- ---------- --------------------
1           uno        1
1           uno        2
2           dos        1
2           dos        2
2           dos        3
3           tres       1
*/


Paso 3.
Ahora si, de la tabla temporal podrías proceder a borrar TODOS LOS ELEMENTOS CON TOTAL > 1 con lo que borrarías todos los elementos duplicados.

Paso 4. Renombrar tu tabla Original y reemplazarla con la tabla Temporal.

OJO. si tu tabla tiene referencias de integridad (FK) tendrás que eliminar primero estas restricciones para poder hacer la sustitución de tus tablas y volver a crearlas después de la sustitución.

Saludos
Leo.
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