Tengo una tabla con decir 3 columnas. No hay una clave principal, por lo que puede haber filas duplicadas. Necesito solo guardar uno y borrar los otros. ¿Alguna idea de cómo hacer esto es Sql Server?¿Cómo puedo eliminar filas duplicadas en una tabla?
Respuesta
SELECCIONARÍA DISTINCT las filas y las arrojaría en una tabla temporal, luego soltaría la tabla fuente y volvería a copiar los datos de la temperatura. EDITAR: ahora con fragmento de código!
INSERT INTO TABLE_2
SELECT DISTINCT * FROM TABLE_1
GO
DELETE FROM TABLE_1
GO
INSERT INTO TABLE_1
SELECT * FROM TABLE_2
GO
Agregue una columna de identidad para actuar como clave primaria sustituta, y utilícela para identificar dos de las tres filas que se eliminarán.
Consideraría dejar la columna de identidad en su lugar después, o si esto es algún tipo de tabla de enlaces, crear una clave primaria compuesta en las otras columnas.
Agregar una columna de identidad definitivamente ayudará. SQL Server generará una columna fantasma para que cada registro sea único, pero no podrá consultar esta columna. La columna de identidad reducirá parte de esa sobrecarga y garantizará la exclusividad. –
Ésta es una situación difícil estar en. Sin saber su situación particular (tamaño de la tabla, etc) Creo que su mejor tiro es agregar una columna de identidad, poblarlo y elimine de acuerdo con ella. Puede eliminar la columna más tarde, pero le sugiero que la guarde, ya que es realmente bueno tenerla en la tabla
El siguiente ejemplo funciona también cuando su PK es solo un subconjunto de todas las columnas de la tabla.
(Nota:.. Me gusta el enfoque con la inserción de otra columna Identificación del sustituto más Pero tal vez esta solución es muy útil también)
En primer lugar encontrar las filas duplicadas:
SELECT col1, col2, count(*)
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1
Si sólo hay pocos, puede eliminarlos manualmente:
set rowcount 1
delete from t1
where col1=1 and col2=1
el valor de "recuento de filas" debe haber n-1 veces el número de duplicados. En este ejemplo, hay 2 puntos embotados, por lo tanto, el recuento de filas es 1. Si obtiene varias filas duplicadas, debe hacer esto para cada clave primaria única.
Si usted tiene muchos duplicados, y luego copiar cada tecla una vez en anoher tabla:
SELECT col1, col2, col3=count(*)
INTO holdkey
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1
luego copiar las llaves, pero eliminar los duplicados.
SELECT DISTINCT t1.*
INTO holddups
FROM t1, holdkey
WHERE t1.col1 = holdkey.col1
AND t1.col2 = holdkey.col2
En sus llaves tiene ahora claves únicas.Compruebe si usted no recibe ningún resultado:
SELECT col1, col2, count(*)
FROM holddups
GROUP BY col1, col2
Eliminar los duplicados de la tabla original:
DELETE t1
FROM t1, holdkey
WHERE t1.col1 = holdkey.col1
AND t1.col2 = holdkey.col2
insertar las filas originales:
INSERT t1 SELECT * FROM holddups
por cierto y por la totalidad: En Oracle hay un campo oculto que puede usar (rowid):
DELETE FROM our_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM our_table
GROUP BY column1, column2, column3... ;
Debería haber mencionado que lo obtuvo en el sitio de soporte de Microsoft. http://support.microsoft.com/kb/139444 –
@Tony: eso es correcto. En mi defensa: hice copiar esto en mi wiki de programación local y ya ni siquiera sabía de dónde venía. – Martin
Después de limpiar el desorden actual, puede agregar una clave principal que incluya todos los campos de la tabla. eso evitará que te metas en el lío de nuevo. Por supuesto, esta solución podría romper el código existente. Eso tendrá que ser manejado también.
no estoy seguro de si esto funciona con instrucciones DELETE, pero esta es una manera de encontrar las filas duplicadas:
SELECT *
FROM myTable t1, myTable t2
WHERE t1.field = t2.field AND t1.id > t2.id
No estoy seguro de si sólo se puede cambiar el "SELECT" a un " BORRAR "(¿alguien me quiere avisar?), pero incluso si no puede, puede hacerlo en una subconsulta.
Este es el método que utiliza when I asked this question -
DELETE MyTable
FROM MyTable
LEFT OUTER JOIN (
SELECT MIN(RowId) as RowId, Col1, Col2, Col3
FROM MyTable
GROUP BY Col1, Col2, Col3
) as KeepRows ON
MyTable.RowId = KeepRows.RowId
WHERE
KeepRows.RowId IS NULL
Se puede añadir un campo de identidad de clave principal a la tabla?
Manrico Corazzi - Me especializarse en Oracle, MS SQL no, por lo que tiene que decirme si esto es posible, ya que un aumento de rendimiento: -
- salir de la misma como su primer paso - inserte distinta valores en la TABLA2 de la TABLA1.
- Drop TABLE1. (Drop debería ser más rápido que eliminar, supongo, tanto como truncar es más rápido que eliminar).
- Cambie el nombre TABLE2 como TABLE1 (le ahorra tiempo, ya que cambia el nombre de un objeto en lugar de copiar datos de una tabla a otra).
Ésta es otra manera, con datos de prueba
create table #table1 (colWithDupes1 int, colWithDupes2 int)
insert into #table1
(colWithDupes1, colWithDupes2)
Select 1, 2 union all
Select 1, 2 union all
Select 2, 2 union all
Select 3, 4 union all
Select 3, 4 union all
Select 3, 4 union all
Select 4, 2 union all
Select 4, 2
select * from #table1
set rowcount 1
select 1
while @@rowcount > 0
delete #table1 where 1 < (select count(*) from #table1 a2
where #table1.colWithDupes1 = a2.colWithDupes1
and #table1.colWithDupes2 = a2.colWithDupes2
)
set rowcount 0
select * from #table1
Ésta es una manera de hacerlo con expresiones de tabla comunes, CTE. No implica bucles, ni columnas nuevas ni nada, y no hará que se desencadenen disparadores no deseados (debido a eliminaciones + inserciones).
Inspirado en this article.
CREATE TABLE #temp (i INT)
INSERT INTO #temp VALUES (1)
INSERT INTO #temp VALUES (1)
INSERT INTO #temp VALUES (2)
INSERT INTO #temp VALUES (3)
INSERT INTO #temp VALUES (3)
INSERT INTO #temp VALUES (4)
SELECT * FROM #temp
;
WITH [#temp+rowid] AS
(SELECT ROW_NUMBER() OVER (ORDER BY i ASC) AS ROWID, * FROM #temp)
DELETE FROM [#temp+rowid] WHERE rowid IN
(SELECT MIN(rowid) FROM [#temp+rowid] GROUP BY i HAVING COUNT(*) > 1)
SELECT * FROM #temp
DROP TABLE #temp
Muy agradable. Siempre estoy sorprendido con lo que CTE puede hacer. –
@Jonas - eso, mi amigo, es genial. Y solo resolvió un problema que tuve. ¡Gracias! –
¿Qué tal:
select distinct * into #t from duplicates_tbl
truncate duplicates_tbl
insert duplicates_tbl select * from #t
drop table #t
¿Qué pasa con esta solución:
En primer lugar, ejecute la siguiente consulta:
select 'set rowcount ' + convert(varchar,COUNT(*)-1) + ' delete from MyTable where field=''' + field +'''' + ' set rowcount 0' from mytable group by field having COUNT(*)>1
Y luego sólo hay que ejecutar el resultado devuelto establecer
set rowcount 3 delete from Mytable where field='foo' set rowcount 0
....
....
set rowcount 5 delete from Mytable where field='bar' set rowcount 0
He manejado el caso cuando se tiene sólo una columna, pero es bastante fácil de adaptar el mismo enfoque tomore de una columna. Avísame si quieres que publique el código.
- 1. Eliminar varias filas duplicadas en la tabla
- 2. cómo eliminar filas duplicadas de una tabla en mysql
- 3. Cómo eliminar filas duplicadas y actualizar la tabla
- 4. Eliminación de filas duplicadas de una tabla
- 5. ¿Cómo eliminar filas duplicadas con SQL?
- 6. Eliminar filas duplicadas y mantenga una fila
- 7. R, eliminar condicionalmente filas duplicadas
- 8. Eliminar filas duplicadas (no eliminar todas las duplicadas)
- 9. Eliminar filas "duplicadas" en SQL Server 2010
- 10. ¿Cómo detectar filas duplicadas en una tabla de SQL Server?
- 11. Eliminar filas duplicadas en Django DB
- 12. ¿Cómo puedo encontrar efectivamente filas de blob duplicadas en MySQL?
- 13. ¿Cómo puedo comparar dos tablas y eliminar las filas duplicadas en SQL?
- 14. Eliminar filas duplicadas dejando la fila más antigua ¿Solo?
- 15. Eliminar filas duplicadas de un archivo grande en Python
- 16. ¿Cómo eliminar filas duplicadas del archivo plano utilizando SSIS?
- 17. Cómo eliminar varias filas en una tabla de datos?
- 18. Seleccionar una fila de filas duplicadas
- 19. ¿Cómo mantener solo una fila de una tabla, eliminando las filas duplicadas?
- 20. filas duplicadas en la vista de tabla en uitableviewcell
- 21. Renombrar filas duplicadas
- 22. TSQL eliminar filas duplicadas en alguna columna sólo
- 23. Lote para eliminar filas duplicadas del archivo de texto
- 24. Consolidar filas duplicadas
- 25. SQL Eliminar filas basadas en otra tabla
- 26. Obtener lista de filas duplicadas en MySQL
- 27. ¿Cómo suprimir por completo las filas duplicadas
- 28. devolver todas las filas duplicadas
- 29. ¿Cómo encontrar filas duplicadas basadas en múltiples campos en MySQL?
- 30. ¿Cómo actualizo n filas en una tabla?
esa es la solución más limpia y genérica, dado que tiene el espacio en disco (la frontera final) – tzot
¿No hay forma de hacerlo con una consulta SQL? En realidad eso es –
tres consultas: INSERT INTO table_2 SELECT DISTINCT * FROM table_1 GO CANCELACIÓN de table_1 ir INSERT INTO table_1 SELECT * FROM table_2 IR –