2009-08-03 11 views
41

MS Access tiene un botón para generar código sql para buscar filas duplicadas. No sé si SQL Server 2005/2008 Managment Studio tiene esto.¿Cómo obtener el código T-SQL para encontrar duplicados?

  1. Si es así, por favor, señalar donde

  2. Si no es así, por favor dígame cómo puedo tener un ayudante de T-SQL para la creación de un código como éste.

Respuesta

107

Bueno, si usted tiene filas enteras como duplicados en su mesa, que haya por lo menos no tiene una clave principal establecido para esa tabla, de lo contrario, al menos, el valor de clave principal sería diferente.

Sin embargo, aquí es cómo construir un SQL para obtener duplicados sobre un conjunto de columnas:

SELECT col1, col2, col3, col4 
FROM table 
GROUP BY col1, col2, col3, col4 
HAVING COUNT(*) > 1 

Esto encontrará filas que, por columnas col1-col4, tiene la misma combinación de valores, más de una vez .

Por ejemplo, en la siguiente tabla, las filas 2 + 3 serían duplicados:

PK col1 col2 col3 col4 col5 
1  1  2  3  4  6 
2  1  3  4  7  7 
3  1  3  4  7  10 
4  2  3  1  4  5 

Las dos filas comparten valores comunes en las columnas col1-col4, y así, por que SQL, se considera duplicados. Expanda la lista de columnas para contener todas las columnas para las que desea analizar esto.

+0

Usted tiene un punto, ya que el código no es tan difícil como esperaba . En otros lenguajes de SQL puede ser difícil codificar manualmente –

+3

No debería ser, esto es SQL estándar, nada específico para T-SQL. Debería ser el mismo para MySQL, SQLite, Oracle, Sybase, DB2, etc. –

+0

Tiene razón. La falta de resaltado de sintaxis y el código ruidoso me hizo creer que el código generado por MS Access era difícil de entender y ni siquiera lo intenté antes. –

2

AFAIK, no es así. Simplemente haga una agrupación de enunciados selectos por todos los campos de una tabla, y filtrando usando una cláusula having donde el conteo sea mayor que 1.

Si sus filas están duplicadas excepto por la clave, entonces no incluya la clave los campos seleccionados

51

Si está utilizando SQL Server 2005 +, puede utilizar el siguiente código para ver todas las filas junto con otras columnas:

SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber 
FROM table 

Youd también puede eliminar (o no trabajar) duplica el uso de este técnica:

WITH cte AS 
(SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber 
    FROM table 
) 
DELETE FROM cte WHERE DuplicateRowNumber > 1 

ROW_NUMBER es muy potente - no hay mucho que se pueda hacer con él - véase el artículo BOL en él en http://msdn.microsoft.com/en-us/library/ms186734.aspx

+3

+1 para educarnos sobre cómo eliminar. Además, tu fragmento también incluye el PK. /necro – theTuxRacer

+0

esto debería ser votado para top1 – SQueek

+0

Otra ventaja es que parece que se ejecuta más rápido que el grupo por los enfoques que he visto. –

5

me encontré con este sol lución cuando necesito para volcar filas enteras con uno o más campos duplicados, pero no quiero que escribir cada nombre de campo en la tabla:

SELECT * FROM db WHERE col IN 
    (SELECT col FROM db GROUP BY col HAVING COUNT(*) > 1) 
    ORDER BY col 
Cuestiones relacionadas