none
registros iguales en una tabla RRS feed

Respuestas

  • Hola,

    Si tienes un campo por el que vas a comparar, utiliza un Count y Agrupa por este campo y veras la cantidad que hay con el mismo valor, por ejemplo:

    declare @prueba table (c1 char)
    
    insert into @prueba values('A')
    insert into @prueba values('A')
    insert into @prueba values('B')
    insert into @prueba values('B')
    insert into @prueba values('D')
    
    Select c1, COUNT(*) cantidad
    From @prueba
    Group By c1
    

     

    Esto retornaría:

    c1  cantidad
    A        2
    B        2
    C        1



    Espero que te sirva.


    Willy Taveras.-

    http://itlearn.net

    • Marcado como respuesta Augusto C sábado, 1 de enero de 2011 15:41
    lunes, 20 de diciembre de 2010 14:57
    Moderador
  • Ok, ya ubique los registros iguales , como podria borrar tan solo uno de ellos si son iguales en todos sus campos.

    se puede ello?

    Hola,

    Favor sigue este ejemplo, lee bien los comentarios para que sepas de que se trata cada linea.

    --En este ejemplo utilizare una tabla temporal que representa tu tabla,
    
    
    --suponiendo que tienes un campo por el que validaras pondre C1 como ese campo.
    
    
    
    declare
    
     @prueba table
    
     (C1 int
    
    , valor1 int
    
    , valor2 varchar
    
    (10))
    
    --Inserto valores a la tabla, veras que el primer campo repito el valor en ocasiones.
    
    
    
    insert
    
     into
    
     @prueba values
    
    (1, 255, 'Prueba1'
    
    )
    insert
    
     into
    
     @prueba values
    
    (1, 255, 'Prueba1'
    
    )
    insert
    
     into
    
     @prueba values
    
    (1, 255, 'Prueba1'
    
    )
    insert
    
     into
    
     @prueba values
    
    (1, 255, 'Prueba1'
    
    )
    insert
    
     into
    
     @prueba values
    
    (2, 12, 'Prueba2'
    
    )
    insert
    
     into
    
     @prueba values
    
    (2, 12, 'Prueba2'
    
    )
    insert
    
     into
    
     @prueba values
    
    (2, 12, 'Prueba2'
    
    )
    insert
    
     into
    
     @prueba values
    
    (3, 142, 'Prueba3'
    
    )
    
    /*
     En la insercion anterior tenemos:
     
     Cuatro veces: 1
     Tres veces: 2
     Una vez: 3
    
    */
    
    
    
    /*Haremos esto dentro de un Begin Tran para en caso de que no sea el resultado
     deseado entonces solo hacemos Rollback, si funciona hacemos Commit*/
    
    
    
    Begin
    
     Tran
    
    
    
    --Insertamos dentro de una tabla temporal los valores
    
    
    -- que contiene el valor repetido y las veces que repite (solo se incluyen los repetidos)
    
    
    
    	SELECT
    
     C1, conteo = count
    
    (*)
    	INTO
    
     Datos1
    	FROM
    
     @prueba
    	GROUP
    
     BY
    
     C1
    	HAVING
    
     count
    
    (*) > 1
    
    /*Seleccionamos todos los valores distintos de la tabla original (en nuestro caso @prueba)
     y hacemos un Join con la tabla temporal para comparar el ID o el campo repetido entre ellas */
    
    
    
    SELECT
    
     DISTINCT
    
     t1.*
    INTO
    
     Datos2
    FROM
    
     @prueba t1, Datos1
    Where
    
     t1.C1 = Datos1.C1
    
    --Eliminamos de la tabla @pruebas todos los datos repetidos. (quedan los que nunca se repitieron)
    
    
    
    DELETE
    
     t1
    FROM
    
     @prueba t1, Datos1
    Where
    
     t1.C1 = Datos1.C1
    
    --Insertamos en la tabla de @pruebas los datos que antes se repetian, pero ahora unicos.
    
    
    
    INSERT
    
     @prueba SELECT
    
     * FROM
    
     Datos2
    
    --Para comprobar, seleccionamos todos los valores de la tabla de Pruebas.
    
    
    
    Select
    
     *
    From
    
     @prueba
    
    --Eliminamos las tablas temporales.
    
    
    
    drop
    
     table
    
     Datos1
    drop
    
     table
    
     Datos2
    
    --Rollback
    
    
    --Commit
    
    
    



    Fuentes:

    http://itlearn.net/sql08.aspx

    http://support.microsoft.com/kb/139444 |



    Espero que sepas aplicarlo.


    Willy Taveras.-

    http://itlearn.net

    lunes, 20 de diciembre de 2010 16:14
    Moderador
  • Puedes usar una CTE en conjunto con la funcion de rango ROW_NUMBER.

    Ejemplo:

    declare @T table (c1 int, c2 varchar(25));

    insert into @T values (1, 'Microsoft');
    insert into @T values (1, 'Microsoft');
    insert into @T values (2, 'Oracle');
    insert into @T values (3, 'DB2');
    insert into @T values (3, 'DB2');

    select * from @T;

    with rs as (
    select row_number() over(partition by c1, c2 order by (select NULL)) as rn
    from @T
    )
    delete rs
    where rn > 1;

    select * from @T;
    GO

    La idea es asignar un numero sequencial por cada grupo de filas iguales, y luego eliminar las filas donde el # sequencial sea mayor a uno.

    Finalmente, busca una grupo de columnas que sirvan para identificar unicamente cada fila, y adiciona una restriccion de unicidad o clave primaria para evitar este problema en un futuro.


    AMB

    Some guidelines for posting questions...

    lunes, 20 de diciembre de 2010 16:56

Todas las respuestas

  • Haz una comparación campo a campo entre las dos tablas que quieres comparar y sabrás los registros iguales.

    También puedes usar la utilidad tablediff (http://technet.microsoft.com/es-es/library/ms162843.aspx) para comparar dos conjuntos de registros

    lunes, 20 de diciembre de 2010 14:48
  • Hola en realidad los registros igual estan en una sola tabla , ya los ubique , ahora el problema esque quiero borrar uno de ellos pero no se como ya que coinciden en todos sus campos , hay alguna sentencia que me permita borrar solo uno??
    lunes, 20 de diciembre de 2010 14:52
  • Hola,

    Si tienes un campo por el que vas a comparar, utiliza un Count y Agrupa por este campo y veras la cantidad que hay con el mismo valor, por ejemplo:

    declare @prueba table (c1 char)
    
    insert into @prueba values('A')
    insert into @prueba values('A')
    insert into @prueba values('B')
    insert into @prueba values('B')
    insert into @prueba values('D')
    
    Select c1, COUNT(*) cantidad
    From @prueba
    Group By c1
    

     

    Esto retornaría:

    c1  cantidad
    A        2
    B        2
    C        1



    Espero que te sirva.


    Willy Taveras.-

    http://itlearn.net

    • Marcado como respuesta Augusto C sábado, 1 de enero de 2011 15:41
    lunes, 20 de diciembre de 2010 14:57
    Moderador
  • Ok, ya ubique los registros iguales , como podria borrar tan solo uno de ellos si son iguales en todos sus campos.

    se puede ello?

    lunes, 20 de diciembre de 2010 15:04
  • Ok, ya ubique los registros iguales , como podria borrar tan solo uno de ellos si son iguales en todos sus campos.

    se puede ello?

    Hola,

    Favor sigue este ejemplo, lee bien los comentarios para que sepas de que se trata cada linea.

    --En este ejemplo utilizare una tabla temporal que representa tu tabla,
    
    
    --suponiendo que tienes un campo por el que validaras pondre C1 como ese campo.
    
    
    
    declare
    
     @prueba table
    
     (C1 int
    
    , valor1 int
    
    , valor2 varchar
    
    (10))
    
    --Inserto valores a la tabla, veras que el primer campo repito el valor en ocasiones.
    
    
    
    insert
    
     into
    
     @prueba values
    
    (1, 255, 'Prueba1'
    
    )
    insert
    
     into
    
     @prueba values
    
    (1, 255, 'Prueba1'
    
    )
    insert
    
     into
    
     @prueba values
    
    (1, 255, 'Prueba1'
    
    )
    insert
    
     into
    
     @prueba values
    
    (1, 255, 'Prueba1'
    
    )
    insert
    
     into
    
     @prueba values
    
    (2, 12, 'Prueba2'
    
    )
    insert
    
     into
    
     @prueba values
    
    (2, 12, 'Prueba2'
    
    )
    insert
    
     into
    
     @prueba values
    
    (2, 12, 'Prueba2'
    
    )
    insert
    
     into
    
     @prueba values
    
    (3, 142, 'Prueba3'
    
    )
    
    /*
     En la insercion anterior tenemos:
     
     Cuatro veces: 1
     Tres veces: 2
     Una vez: 3
    
    */
    
    
    
    /*Haremos esto dentro de un Begin Tran para en caso de que no sea el resultado
     deseado entonces solo hacemos Rollback, si funciona hacemos Commit*/
    
    
    
    Begin
    
     Tran
    
    
    
    --Insertamos dentro de una tabla temporal los valores
    
    
    -- que contiene el valor repetido y las veces que repite (solo se incluyen los repetidos)
    
    
    
    	SELECT
    
     C1, conteo = count
    
    (*)
    	INTO
    
     Datos1
    	FROM
    
     @prueba
    	GROUP
    
     BY
    
     C1
    	HAVING
    
     count
    
    (*) > 1
    
    /*Seleccionamos todos los valores distintos de la tabla original (en nuestro caso @prueba)
     y hacemos un Join con la tabla temporal para comparar el ID o el campo repetido entre ellas */
    
    
    
    SELECT
    
     DISTINCT
    
     t1.*
    INTO
    
     Datos2
    FROM
    
     @prueba t1, Datos1
    Where
    
     t1.C1 = Datos1.C1
    
    --Eliminamos de la tabla @pruebas todos los datos repetidos. (quedan los que nunca se repitieron)
    
    
    
    DELETE
    
     t1
    FROM
    
     @prueba t1, Datos1
    Where
    
     t1.C1 = Datos1.C1
    
    --Insertamos en la tabla de @pruebas los datos que antes se repetian, pero ahora unicos.
    
    
    
    INSERT
    
     @prueba SELECT
    
     * FROM
    
     Datos2
    
    --Para comprobar, seleccionamos todos los valores de la tabla de Pruebas.
    
    
    
    Select
    
     *
    From
    
     @prueba
    
    --Eliminamos las tablas temporales.
    
    
    
    drop
    
     table
    
     Datos1
    drop
    
     table
    
     Datos2
    
    --Rollback
    
    
    --Commit
    
    
    



    Fuentes:

    http://itlearn.net/sql08.aspx

    http://support.microsoft.com/kb/139444 |



    Espero que sepas aplicarlo.


    Willy Taveras.-

    http://itlearn.net

    lunes, 20 de diciembre de 2010 16:14
    Moderador
  • Puedes usar una CTE en conjunto con la funcion de rango ROW_NUMBER.

    Ejemplo:

    declare @T table (c1 int, c2 varchar(25));

    insert into @T values (1, 'Microsoft');
    insert into @T values (1, 'Microsoft');
    insert into @T values (2, 'Oracle');
    insert into @T values (3, 'DB2');
    insert into @T values (3, 'DB2');

    select * from @T;

    with rs as (
    select row_number() over(partition by c1, c2 order by (select NULL)) as rn
    from @T
    )
    delete rs
    where rn > 1;

    select * from @T;
    GO

    La idea es asignar un numero sequencial por cada grupo de filas iguales, y luego eliminar las filas donde el # sequencial sea mayor a uno.

    Finalmente, busca una grupo de columnas que sirvan para identificar unicamente cada fila, y adiciona una restriccion de unicidad o clave primaria para evitar este problema en un futuro.


    AMB

    Some guidelines for posting questions...

    lunes, 20 de diciembre de 2010 16:56
  • Hola.

    Como forma rápida de hacerlo, puedes limitar el rowcount a 1:

    set rowcount 1

    delete ...

    Si estamos hablando ya de muchos casos, te recomiendo usar una solución del tipo de la que ha comentado Alejandro.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    • Propuesto como respuesta Andres Vélez martes, 26 de junio de 2012 14:49
    • Votado como útil Andres Vélez martes, 26 de junio de 2012 14:49
    lunes, 20 de diciembre de 2010 17:39
    Moderador