none
Ayuda! elminar filas duplicadas urgente! RRS feed

  • Pregunta

  • Buenas tardes

    esto si es urgentísimo, generé un script de la bd del servidor y por error los ejecuté dentro del servidor y no en mi local (mis tablas aún no terminaba de relacionarlas) y se me creo un duplicado de cada registros en algunas tablas (ya que algunas si están relacionadas):

    Quiero eliminar los duplicados desde allí pero no me dejaaa y necesito sacarlas urgente antes de que el admin de la bd me cuelgue de cabeza. Espero que puedan ayudarme, gracias de antemano

    lunes, 14 de enero de 2013 19:18

Respuestas

  • Aquí un enlace para que lo adaptes a tu codigo:

    http://blog.sqlauthority.com/2012/07/27/sql-server-query-to-get-unique-distinct-data-based-on-condition-eleminate-duplicate-data-from-resultset/

    El concepto es simple, por medio de la funcion ROW_NUMBER() crear un "ranqueo" basado en condiciones especificas que planteas en el segmento Partition, luego esta función esta embebida en una CTE (Common Table Expression) permitiendote eliminar aquellas filas cuyo valor de ranqueo obtenido sea mayor de 1, dejandote unicamente la primera fila (en tu caso la original).


    "How many years can some people exist before they're allowed to be free" Bob Dylan Email: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez

    lunes, 14 de enero de 2013 19:48
  • Con ROW_NUMBER puedes determinar cuales de tus registros están duplicados...aunque lo más raro del asunto es que si tienes una llave primaria, no te debió permitir registros duplicados.

    Suponiendo que tu llave primaria es id_op, num_op( o los campos que no se deben repetir porque al parecer no tienes llave primaria ) te presento una posible solución:

    declare @table table( 
    id_op  int,
    num_op  int,
    fecha_op  datetime,
    id_maquina  int, 
    persona_de  varchar(100),
    persona_a  varchar(100),
    obser  varchar(100)
    )
    
    insert into @table
    VALUES
    (1,10010045,'20130104',5,'NORA CHALLCO','ALMACEN DE ME','MAQUINA DOBL'),
    (2,10010046,'20130104',2,'NORA CHALLCO','ALMACEN DE ME','GRANEL'),
    (4,10010048,'20130108',4,'NORA CHALLCO','ALMACEN DE ME','MAQUINA DOBL'),
    (5,10010050,'20130102',1,'NORA/CHALLCO','ALMACEN DE ME','.'),
    (3,10010047,'20130108',3,'NORA CHALLCO','ALMACEN DE ME','MAQUINA DE RE'),
    (1,10010045,'20130104',5,'NORA CHALLCO','ALMACEN DE ME','MAQUINA DOBL'),
    (2,10010046,'20130104',2,'NORA CHALLCO','ALMACEN DE ME','GRANEL'),
    (4,10010048,'20130108',4,'NORA CHALLCO','ALMACEN DE ME','MAQUINA DOBL'),
    (5,10010050,'20130102',1,'NORA/CHALLCO','ALMACEN DE ME','.'),
    (3,10010047,'20130108',3,'NORA CHALLCO','ALMACEN DE ME','MAQUINA DE RE')
    
    SELECT * FROM @table 
    
    DELETE t 
    FROM (
    select *, ROW_NUMBER() over ( partition by id_op, num_op order by id_op, num_op ) as rn
    from @table ) t 
    where rn > 1
    
    select * from @table 
    
    	

    Ya que estás trabajando con una tabla en productivo, te sugiero que verifiques el resultado de lo que vas a borrar( de tu DELETE ) primero, cambiando el DELETE t por un SELECT * y esto te debe arrojar los registros que pretendes borrar.

    Suerte y SALUDOS !


    Sergio Sánchez Arias


    lunes, 14 de enero de 2013 19:51

Todas las respuestas

  • Que tal Josue...

    1.- lo que deseas es eliminar TODOS los registros duplicados y dejar solo uno de ellos ? o eliminarlos TODOS ?

    2.- Haz tratado con ROW_NUMBER() ?


    Sergio Sánchez Arias

    lunes, 14 de enero de 2013 19:36
  • Hola,

    solo quiero eliminar los duplicados y quedarme con uno, como estaba mi tabla antes.

    No, no he usado row_number(), me explicas por favor? es urgente 

    muchas gracias!

    lunes, 14 de enero de 2013 19:36
  • Aquí un enlace para que lo adaptes a tu codigo:

    http://blog.sqlauthority.com/2012/07/27/sql-server-query-to-get-unique-distinct-data-based-on-condition-eleminate-duplicate-data-from-resultset/

    El concepto es simple, por medio de la funcion ROW_NUMBER() crear un "ranqueo" basado en condiciones especificas que planteas en el segmento Partition, luego esta función esta embebida en una CTE (Common Table Expression) permitiendote eliminar aquellas filas cuyo valor de ranqueo obtenido sea mayor de 1, dejandote unicamente la primera fila (en tu caso la original).


    "How many years can some people exist before they're allowed to be free" Bob Dylan Email: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez

    lunes, 14 de enero de 2013 19:48
  • Con ROW_NUMBER puedes determinar cuales de tus registros están duplicados...aunque lo más raro del asunto es que si tienes una llave primaria, no te debió permitir registros duplicados.

    Suponiendo que tu llave primaria es id_op, num_op( o los campos que no se deben repetir porque al parecer no tienes llave primaria ) te presento una posible solución:

    declare @table table( 
    id_op  int,
    num_op  int,
    fecha_op  datetime,
    id_maquina  int, 
    persona_de  varchar(100),
    persona_a  varchar(100),
    obser  varchar(100)
    )
    
    insert into @table
    VALUES
    (1,10010045,'20130104',5,'NORA CHALLCO','ALMACEN DE ME','MAQUINA DOBL'),
    (2,10010046,'20130104',2,'NORA CHALLCO','ALMACEN DE ME','GRANEL'),
    (4,10010048,'20130108',4,'NORA CHALLCO','ALMACEN DE ME','MAQUINA DOBL'),
    (5,10010050,'20130102',1,'NORA/CHALLCO','ALMACEN DE ME','.'),
    (3,10010047,'20130108',3,'NORA CHALLCO','ALMACEN DE ME','MAQUINA DE RE'),
    (1,10010045,'20130104',5,'NORA CHALLCO','ALMACEN DE ME','MAQUINA DOBL'),
    (2,10010046,'20130104',2,'NORA CHALLCO','ALMACEN DE ME','GRANEL'),
    (4,10010048,'20130108',4,'NORA CHALLCO','ALMACEN DE ME','MAQUINA DOBL'),
    (5,10010050,'20130102',1,'NORA/CHALLCO','ALMACEN DE ME','.'),
    (3,10010047,'20130108',3,'NORA CHALLCO','ALMACEN DE ME','MAQUINA DE RE')
    
    SELECT * FROM @table 
    
    DELETE t 
    FROM (
    select *, ROW_NUMBER() over ( partition by id_op, num_op order by id_op, num_op ) as rn
    from @table ) t 
    where rn > 1
    
    select * from @table 
    
    	

    Ya que estás trabajando con una tabla en productivo, te sugiero que verifiques el resultado de lo que vas a borrar( de tu DELETE ) primero, cambiando el DELETE t por un SELECT * y esto te debe arrojar los registros que pretendes borrar.

    Suerte y SALUDOS !


    Sergio Sánchez Arias


    lunes, 14 de enero de 2013 19:51
  • Gracias a los 2

    lo pude solucionar agregándole un campo identity a cada tabla con el registro idéntico, luego fui a editarlas y borrarlas uno por uno. No sé cuál marcar la respuestas porque las 2 están bien.

    Gracias nuevamente!

    lunes, 14 de enero de 2013 21:11