¿Cómo obtener el código T-SQL para encontrar duplicados?


MS Access tiene un botón para generar código sql para encontrar filas duplicadas. No se si SQL Server 2005/2008 Managment Studio tiene esto.

  1. Si lo ha hecho, indique dónde

  2. Si no lo ha hecho, por favor dígame cómo puedo tener un ayudante de T-SQL para crear código como este.

Author: sth, 2009-08-03

4 answers

Bueno, si tiene filas enteras como duplicados en su tabla, al menos no tiene una clave primaria configurada para esa tabla, de lo contrario, al menos el valor de la clave primaria sería diferente.

Sin embargo, aquí está 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, para las columnas col1-col4, tienen la misma combinación de valores, más de una vez.

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

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

El dos filas comparten valores comunes en las columnas col1-col4, y por lo tanto, por ese SQL, se consideran duplicados. Expanda la lista de columnas para contener todas las columnas para las que desea analizar esto.

 113
Author: Lasse Vågsæther Karlsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-03 14:15:36

Si está utilizando SQL Server 2005+, puede usar 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

También puedes eliminar (o trabajar con) duplicados usando esta 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 extremadamente poderoso - hay mucho que puede hacer con él-vea el artículo de BOL en http://msdn.microsoft.com/en-us/library/ms186734.aspx

 52
Author: Mike DeFehr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-04 22:08:48

Encontré esta solución cuando necesito volcar filas enteras con uno o más campos duplicados, pero no quiero escribir todos los nombres de campo en la tabla:

SELECT * FROM db WHERE col IN
    (SELECT col FROM db GROUP BY col HAVING COUNT(*) > 1)
    ORDER BY col
 5
Author: Ferruccio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-17 16:45:09

AFAIK, no lo hace. Simplemente haga una instrucción select agrupando por todos los campos de una tabla, y filtrando usando una cláusula having donde el recuento es mayor que 1.

Si sus filas están duplicadas excepto por la clave, entonces no incluya la clave en los campos de selección.

 2
Author: eKek0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-03 14:16:51