¿Cómo puedo eliminar filas duplicadas donde no unique row id
existe?
Mi mesa es
col1 col2 col3 col4 col5 col6 col7
john 1 1 1 1 1 1
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
sally 2 2 2 2 2 2
Quiero quedarme con lo siguiente después de la eliminación duplicada:
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
He intentado algunas consultas, pero creo que dependen de tener una identificación de fila, ya que no obtengo el resultado deseado. Por ejemplo:
DELETE
FROM table
WHERE col1 IN (
SELECT id
FROM table
GROUP BY id
HAVING (COUNT(col1) > 1)
)
Respuestas:
Me gustan los CTE y
ROW_NUMBER
como los dos combinados nos permiten ver qué filas se eliminan (o actualizan), por lo tanto, simplemente cambie elDELETE FROM CTE...
aSELECT * FROM CTE
:DEMO (el resultado es diferente; supongo que se debe a un error tipográfico de tu parte)
Este ejemplo determina duplicados por una sola columna
col1
debido aPARTITION BY col1
. Si desea incluir varias columnas, simplemente agréguelas aPARTITION BY
:fuente
AND COl1='John'
). Normalmente debe aplicar el filtro en el CTE....FROM dbo.Table1 WHERE Col1='John'
. Aquí está el violín: sqlfiddle.com/#!6/fae73/744/0set rowcount 1 delete from t1 where col1=1 and col2=1
que se ve aquíPreferiría CTE para eliminar filas duplicadas de la tabla del servidor sql
recomiendo seguir este artículo :: http://codaffection.com/sql-server-article/delete-duplicate-rows-in-sql-server/
fuente
Sin usar
CTE
yROW_NUMBER()
solo puede eliminar los registros simplemente usando group by con laMAX
función aquí es y ejemplofuente
MIN(ID)
fuente
Por favor, consulte la siguiente forma de eliminación también.
Creó una tabla de muestra llamada
@table
y la cargó con datos dadosNota: Si está dando todas las columnas en la
Partition by
parte, entoncesorder by
no tiene mucha importancia.Lo sé, la pregunta se hizo hace tres años, y mi respuesta es otra versión de lo que Tim ha publicado, pero publicar solo en caso de que sea útil para cualquiera.
fuente
Si no tiene referencias, como claves foráneas, puede hacerlo. Lo hago mucho cuando pruebo pruebas de concepto y los datos de prueba se duplican.
Entra en el explorador de objetos y elimina la tabla anterior.
Cambie el nombre de la nueva tabla con el nombre de la tabla anterior.
fuente
Microsoft tiene una guía muy ordenada sobre cómo eliminar duplicados. Echa un vistazo a http://support.microsoft.com/kb/139444
En resumen, esta es la forma más fácil de eliminar duplicados cuando solo tiene algunas filas para eliminar:
myprimarykey es el identificador de la fila.
Puedo establecer recuento de filas a 1 porque sólo tenía dos filas que se duplicaron. Si hubiera tenido 3 filas duplicadas entonces tendría conjunto recuento de filas a 2 para que elimine los dos primeros que se ve y sólo deja a uno en la tabla t1.
Espero que ayude a cualquiera
fuente
Tratar de usar:
fuente
Después de probar la solución sugerida anteriormente, eso funciona para tablas medianas pequeñas. Puedo sugerir esa solución para tablas muy grandes. ya que se ejecuta en iteraciones.
LargeSourceTable
sp_rename 'LargeSourceTable', 'LargeSourceTable_Temp'; GO
LargeSourceTable
nuevo, pero ahora, agregue una clave principal con todas las columnas que definen las duplicaciones.WITH (IGNORE_DUP_KEY = ON)
Por ejemplo:
CREATE TABLE [dbo].[LargeSourceTable] ( ID int IDENTITY(1,1), [CreateDate] DATETIME CONSTRAINT [DF_LargeSourceTable_CreateDate] DEFAULT (getdate()) NOT NULL, [Column1] CHAR (36) NOT NULL, [Column2] NVARCHAR (100) NOT NULL, [Column3] CHAR (36) NOT NULL, PRIMARY KEY (Column1, Column2) WITH (IGNORE_DUP_KEY = ON) ); GO
Cree de nuevo las vistas que dejó caer en primer lugar para la nueva tabla creada
Ahora, ejecute el siguiente script sql, verá los resultados en 1,000,000 de filas por página, puede cambiar el número de fila por página para ver los resultados con más frecuencia.
Tenga en cuenta que configuré la
IDENTITY_INSERT
activación y desactivación porque una de las columnas contiene una identificación incremental automática, que también estoy copiandoSET IDENTITY_INSERT LargeSourceTable ON DECLARE @PageNumber AS INT, @RowspPage AS INT DECLARE @TotalRows AS INT declare @dt varchar(19) SET @PageNumber = 0 SET @RowspPage = 1000000
select @TotalRows = count (*) from LargeSourceTable_TEMP
SET IDENTITY_INSERT LargeSourceTable OFF
fuente
Hay dos soluciones en
mysql
:A) Eliminar filas duplicadas usando la
DELETE JOIN
instrucciónEsta consulta hace referencia a la tabla de contactos dos veces, por lo tanto, utiliza el alias de la tabla
t1
yt2
.El resultado es:
En caso de que desee eliminar filas duplicadas y conservar
lowest id
, puede usar la siguiente instrucción:B) Eliminar filas duplicadas usando una tabla intermedia
A continuación se muestran los pasos para eliminar filas duplicadas utilizando una tabla intermedia:
1. Cree una nueva tabla con la estructura igual a la tabla original que desea eliminar filas duplicadas.
2. Inserte filas distintas de la tabla original a la tabla inmediata.
3. Inserte filas distintas de la tabla original a la tabla inmediata.
Paso 1. Cree una nueva tabla cuya estructura sea la misma que la tabla original:
Paso 2. Inserte filas distintas de la tabla original a la nueva tabla:
Paso 3. suelte la tabla original y cambie el nombre de la tabla inmediata a la original
Fuente: http://www.mysqltutorial.org/mysql-delete-duplicate-rows/
fuente
fuente
Debe agrupar por registros duplicados de acuerdo con los campos, luego mantener uno de los registros y eliminar el resto. Por ejemplo:
fuente
Eliminar duplicados de una tabla enorme (varios millones de registros) puede llevar mucho tiempo. Le sugiero que haga una inserción masiva en una tabla temporal de las filas seleccionadas en lugar de eliminar.
fuente
Se puede hacer de muchas maneras en el servidor sql. La forma más sencilla de hacerlo es: insertar las filas distintas de la tabla de filas duplicadas en la nueva tabla temporal. Luego elimine todos los datos de la tabla de filas duplicadas y luego inserte todos los datos de la tabla temporal que no tiene duplicados como se muestra a continuación.
Eliminar filas duplicadas usando la expresión de tabla común (CTE)
fuente
fuente
Con referencia a https://support.microsoft.com/en-us/help/139444/how-to-remove-duplicate-rows-from-a-table-in-sql-server
La idea de eliminar duplicados implica
Paso a paso
fuente
Si tiene la capacidad de agregar una columna a la tabla temporalmente, esta fue una solución que funcionó para mí:
Luego realice un BORRAR usando una combinación de MIN y GROUP BY
Verifique que DELETE haya funcionado correctamente:
El resultado no debe tener filas con un recuento mayor que 1. Finalmente, elimine la columna rowid:
fuente
Otra forma de eliminar filas duplicadas sin perder información en un solo paso es la siguiente:
fuente
Oh wow, me siento tan estúpido al preparar todas estas respuestas, son como la respuesta de los expertos con todo el CTE y la tabla temporal, etc.
Y todo lo que hice para que funcionara fue simplemente agregar la columna ID usando MAX.
NOTA: es posible que deba ejecutarlo varias veces para eliminar duplicados, ya que esto solo eliminará un conjunto de filas duplicadas a la vez.
fuente
fuente
fuente