¿Cuál es la mejor manera de eliminar todas las filas de una tabla en sql pero mantener n número de filas en la parte superior?Eliminar todo menos top n de la tabla de la base de datos en SQL
Respuesta
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)
Editar:
Chris aporta un buen rendimiento golpeado desde el 10 TOP consulta se ejecuta para cada fila. Si esto es una cosa de una sola vez, entonces puede no ser tan importante, pero si es algo común, entonces lo miré más de cerca.
No sé sobre otros sabores pero MySQL DELETE permite LIMITAR.
Si pudiera ordenar cosas para que las n filas que desea mantener estén en la parte inferior, entonces podría hacer un BORRAR DE la tabla LIMIT tablecount-n.
Editar
Oooo. Creo que me gusta Cory Foy's responder mejor, suponiendo que funcione en su caso. Mi manera se siente un poco torpe en comparación.
Lo resolvería usando la técnica a continuación. El ejemplo espera un artículo tabla con un id en cada fila.
Delete article where id not in (select top 1000 id from article)
Editar: Demasiado lento para responder a mi propia pregunta ...
Me gustaría seleccionar la columna (s) de identificación del conjunto de filas que desea guardar en una tabla temporal o variable de tabla. A continuación, elimine todas las filas que no existen en la tabla temporal. La sintaxis mencionada por otro usuario:
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)
Tiene un problema potencial. La consulta "SELECCIONAR TOP 10" se ejecutará para cada fila de la tabla, lo que podría ser un gran golpe de rendimiento. Desea evitar hacer la misma consulta una y otra vez.
Esta sintaxis debe trabajar, en base de lo que aparece como su estado original de SQL:
create table #nuke(NukeID int)
insert into #nuke(Nuke) select top 1000 id from article
delete article where not exists (select 1 from nuke where Nukeid = id)
drop table #nuke
'insert into #nuke (Nuke) ...' probablemente debería ser: 'insert into #nuke (NukeID) ...' También el nombre nuke es confuso porque estás tratando de NO eliminar estas filas. nuke probablemente se nombre por el hecho de que se eliminará. –
refactorizado?
Delete a From Table a Inner Join (
Select Top (Select Count(tableID) From Table) - 10)
From Table Order By tableID Desc
) b On b.tableID = A.tableID
edición: ellos trató tanto en el analizador de consultas, la respuesta actual se ayunó (orden maldita por ...)
mejor manera sería insertar las filas que desea en otra tabla, suelte la tabla original y luego cambie el nombre de la nueva tabla para que tenga el mismo nombre que la tabla anterior
¿Por qué es eso mejor? ¿Más rápido? Requiere un par de comandos adicionales para lograr. – MeanGreen
Referencia futura para los usuarios que no usan MS SQL.
En PostgreSQL use ORDER BY
y LIMIT
en lugar de TOP
.
DELETE FROM table
WHERE id NOT IN (SELECT id FROM table ORDER BY id LIMIT n);
MySQL - bien ...
error - Esta versión de MySQL todavía no soporta 'LÍMITE & EN/ALL/ANY/SOME subconsulta'
Todavía no supongo.
Esto realmente va a ser específico del idioma, pero es probable que utilice algo como lo siguiente para el servidor SQL.
declare @n int
SET @n = SELECT Count(*) FROM dTABLE;
DELETE TOP (@n - 10) FROM dTable
si no se preocupan por el número exacto de filas, siempre hay
DELETE TOP 90 PERCENT FROM dTABLE;
Ninguno de estos funciona. La pregunta pregunta cómo mantener solo las primeras N filas en una tabla. Ambos ejemplos mantienen solo las N filas inferiores. – Chris
Funciona bien en MSSQL. ¿Simplemente agrega una clasificación para eliminar la parte inferior en lugar de la parte superior? – MeanGreen
Creo usando una tabla virtual sería mucho mejor que una tabla en la cláusula o temp.
DELETE
Product
FROM
Product
LEFT OUTER JOIN
(
SELECT TOP 10
Product.id
FROM
Product
) TopProducts ON Product.id = TopProducts.id
WHERE
TopProducts.id IS NULL
- 1. SQl Eliminar top 100 de la tabla
- 2. SELECT TOP N con la variable
- 3. Eliminar las primeras N filas en la base de datos sqlite de Android
- 4. ¿Actualizar la tabla de la base de datos de una tabla de base de datos de SQL Server a otra?
- 5. Eliminar los últimos N caracteres del campo en una base de datos SQL Server
- 6. seleccione las filas TOP N de una tabla
- 7. Estructura de la base de datos SQL
- 8. Eliminar todos los datos en la base de datos SQL Server
- 9. Retorno de filas desbloqueadas en una consulta "seleccionar top n"
- 10. claves externas en la tabla de base de datos diferente
- 11. Seleccionar n filas aleatorias de la tabla de SQL Server
- 12. versión preliminar de la tabla de la base de datos
- 13. Ver todo el texto en la columna ntext Management Studio de SQL Server para la base de datos SQL CE
- 14. Eliminar todas las filas de la tabla de la base de datos SQLite
- 15. Android: Eliminar toda la base de datos
- 16. cómo insertar fecha y hora en la tabla de la base de datos SQL?
- 17. Eliminación de datos jerárquicos en la tabla SQL
- 18. borrar todo de la tabla
- 19. Eliminar registros más antiguos de la base de datos
- 20. Mostrar datos de la base de datos SQL en Gridview
- 21. truncar toda la tabla en la base de datos mysql
- 22. Eliminar (fusionar) Archivo de datos secundarios de la base de datos SQL Servers
- 23. cómo eliminar la fila de la tabla en el diseño de la tabla en android
- 24. ¿Cómo eliminar desde una base de datos?
- 25. Copie la tabla de una base de datos a otra
- 26. ¿Eliminar la fila de la lista eliminar fila de la tabla base - MYsql?
- 27. borrar todo el registro de la tabla en mysql
- 28. iPhone: ¿Eliminar/eliminar la base de datos SQLite?
- 29. de expresiones regulares para eliminar todo menos caracteres y números
- 30. ¿Cómo insertar caracteres arábigos en la base de datos sql?
Si alguien comúnmente necesita eliminar todas las n filas, diría que tienen problemas más importantes de los que preocuparse. –
Solo una nota de que puede resolver el problema de rendimiento de la subconsulta creando manualmente una tabla temporal (asumiendo que esta es una operación poco frecuente) o escribiendo la consulta como 'DELETE FROM Tabla WHERE ID NOT IN (SELECCIONE ID FROM (SELECCIONE IDENTIFICACIÓN DE TOP 10 Tabla) AS x) 'forzar a MySQL a crear una tabla temporal. –
Gracias. Eso fue un salvavidas :) – Si8