Cómo quitar filas duplicadas de una tabla en SQL Server

Extended support for SQL Server 2005 ended on April 12, 2016

If you are still running SQL Server 2005, you will no longer receive security updates and technical support. We recommend upgrading to SQL Server 2014 and Azure SQL Database to achieve breakthrough performance, maintain security and compliance, and optimize your data platform infrastructure. Learn more about the options for upgrading from SQL Server 2005 to a supported version here.

IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.

Haga clic aquí para ver el artículo original (en inglés): 139444
Resumen
Tablas de Microsoft SQL Server nunca deben contener filas duplicadas, nornon único claves principales. Para mayor brevedad, nos a veces referiremos a primarykeys como "clave" o "PK" de este artículo, pero lo hacemos "primarykey". Hay PK duplicadas es una infracción de integridad de entidad y debe bedisallowed en un sistema relacional. SQL Server tiene varios mecanismos forenforcing la integridad de entidad, incluidos índices, restricciones UNIQUE, restricciones PRIMARY KEY y los desencadenadores.

A pesar de esto, en circunstancias inusuales pueden existir claves principales duplicadas y, si es así debe eliminarse. Una forma que pueden ocurrir es si duplicatePKs existe en datos no relacionales fuera de SQL Server y el isimported de datos mientras no se está aplicando la unicidad de las claves. Otra forma de canoccur es a través de un error de diseño de base de datos, como no exigir entityintegrity en cada tabla.

A menudo hay PK duplicadas se notan cuando se intenta crear un índice único, que el proceso se anula cuando se encuentran claves duplicadas. Este mensaje es:
Msg 1505, nivel 16, estado 1Crear unique index terminó clave duplicada.
Si está utilizando SQL Server 2000 o SQL Server 2005, puede recibir el siguiente mensaje de error:
Msg 1505, nivel 16, estado 1 CREATE UNIQUE INDEX terminado porque se encontró una clave duplicada para el nombre de objeto ' %. * ls' y el nombre de índice ' %. * ls'. El valor de clave duplicado es %ls.
Este artículo describe cómo buscar y quitar la tabla de claves principales duplicadas desde un. Sin embargo, debería examinar cuidadosamente el proceso que permitió theduplicates a suceder con el fin de evitar una repetición.

Más información
Para este ejemplo, utilizaremos la siguiente tabla con valores PK duplicados. En esta tabla la clave principal es las dos columnas (col1, col2). Se cannotcreate un índice único o restricción de CLAVE PRINCIPAL desde dos filas PK haveduplicate. Este procedimiento muestra cómo identificar y quitar theduplicates.
create table t1(col1 int, col2 int, col3 char(50))insert into t1 values (1, 1, 'data value one')insert into t1 values (1, 1, 'data value one')insert into t1 values (1, 2, 'data value two')				
El primer paso es identificar qué filas tienen valores de clave principales duplicados:
SELECT col1, col2, count(*)FROM t1GROUP BY col1, col2HAVING count(*) > 1				
Esto devolverá una fila por cada conjunto de valores de PK duplicados en la tabla. La última columna de este resultado es el número de duplicados para el valor de PK theparticular.

col1col2
112


Si hay sólo unos pocos conjuntos de valores de PK duplicados, el mejor es procedimiento eliminar estos manualmente de forma individual. Por ejemplo:
set rowcount 1delete from t1where col1=1 and col2=1				
El valor de recuento de filas debe ser n-1 el número de duplicados para un determinado valor de clave. En este ejemplo hay 2 duplicados para que el recuento de filas se establece en 1. Los valores de col1 y col2 se obtienen desde el resultado de consulta anterior GROUP BY. Si la consulta GROUP BY devuelve varias filas, la consulta "set rowcount" tendrá que ejecutarse una vez para cada una de estas filas. Cada vez que se ejecuta, establezca rowcount en n-1 el número de duplicados del valor PK concreto.

Antes de eliminar las filas, debe comprobar que la isduplicate de toda la fila. Aunque es poco probable, es posible que los valores PK estén duplicados, aunque no es de la fila completa. Un ejemplo de esto sería un withSocial de la tabla como clave principal, número de la seguridad y tener dos diferentes personas (o filas) con el mismo número, aunque diferentes atributos. En caso de sucha cualquier fallo causado la clave duplicada también puede haber datos únicos de causedvalid a colocarse en la fila. Estos datos deben copiada a andpreserved para el estudio y conciliación posible antes de eliminar los datos.

Si hay muchos conjuntos distintos de valores de PK duplicados en la tabla, que quizás demasiado lentos quitarlos individualmente. En este caso puede utilizarse el procedimiento de thefollowing:
  1. Primero, ejecute la consulta GROUP BY anterior para determinar cuántos conjuntos de valores de PK duplicados existen y el número de duplicados de cada conjunto.
  2. Seleccione los valores de clave duplicados en una tabla contenedora. Por ejemplo:
    SELECT col1, col2, col3=count(*)INTO holdkeyFROM t1GROUP BY col1, col2HAVING count(*) > 1					
  3. Seleccione las filas duplicadas en una tabla contenedora, eliminando los duplicados en el proceso. Por ejemplo:
    SELECT DISTINCT t1.*INTO holddupsFROM t1, holdkeyWHERE t1.col1 = holdkey.col1AND t1.col2 = holdkey.col2					
  4. En este punto, la tabla de paradas debe disponer de un PK único, sin embargo, este no será el caso si t1 tenía PK dobles con filas únicas (como en el ejemplo anterior de SSN). Compruebe que cada clave de holdups es único y que no tiene claves duplicadas, aunque filas únicas. Si es así, debe detener aquí y conciliar cuál de las filas que desee mantener para un determinado valor de clave duplicado. Por ejemplo, la consulta:
    SELECT col1, col2, count(*)FROM holddupsGROUP BY col1, col2						
    debe devolver el valor de 1 para cada fila. En caso afirmativo, vaya al paso 5 a continuación. Si no, tener claves duplicadas, aunque filas únicas y es necesario decidir qué filas se guardarán. Normalmente, esto implica eliminar una fila, o crear un nuevo valor de clave único para esta fila. Tome uno de estos dos pasos para cada PK duplicada de la tabla holdups.
  5. Eliminar las filas duplicadas de la tabla original. Por ejemplo:
    DELETE t1FROM t1, holdkeyWHERE t1.col1 = holdkey.col1AND t1.col2 = holdkey.col2					
  6. Incluir las filas únicas en la tabla original. Por ejemplo:
    INSERT t1 SELECT * FROM holddups					
sql6 de dedupe de entidad intg

Propiedades

Id. de artículo: 139444 - Última revisión: 11/22/2016 04:14:00 - Revisión: 14.0

Microsoft SQL Server 6.0 Standard Edition, Microsoft SQL Server 6.5 Standard Edition, Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Express Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Workgroup Edition

  • kbsqlsetup kbinfo kbusage kbmt KB139444 KbMtes
Comentarios