vaciar - Eliminar todo menos top n de la tabla de la base de datos en SQL
eliminar varios registros sql (9)
¿Cuál es la mejor manera de eliminar todas las filas de una tabla en sql pero para mantener n el número de filas en la parte superior?
Creo que usar una tabla virtual sería mucho mejor que una cláusula IN o una tabla temporal.
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
Esto realmente va a ser específico del idioma, pero probablemente usaría 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 te importa el número exacto de filas, siempre hay
DELETE TOP 90 PERCENT FROM dTABLE;
Lo resolvería usando la técnica a continuación. El ejemplo espera una tabla de artículos con una identificación en cada fila.
Delete article where id not in (select top 1000 id from article)
Editar: Demasiado lento para responder mi propia pregunta ...
No sé sobre otros sabores pero MySQL DELETE permite LIMIT.
Si pudieras ordenar cosas para que las n filas que deseas mantener estén en la parte inferior, entonces podrías hacer un DELETE DE la tabla LIMIT tablecount-n.
Editar
Oooo. Creo que me gusta más la respuesta de Cory Foy , suponiendo que funcione en tu caso. Mi manera se siente un poco torpe en comparación.
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
editar: probé con ambos en el analizador de consultas, la respuesta actual está en ayunas (maldito orden por ...)
Referencia futura para aquellos de uso que no usan MS SQL.
En PostgreSQL use ORDER BY
y LIMIT
lugar de TOP
.
DELETE FROM table
WHERE id NOT IN (SELECT id FROM table ORDER BY id LIMIT n);
MySQL - bueno ...
Error - Esta versión de MySQL aún no admite ''LIMIT & IN / ALL / ANY / ALGUNA subconsulta''
Todavía no, supongo.
Seleccionaría columna (s) de ID el conjunto de filas que desea mantener 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 debería funcionar, de acuerdo con lo que usted indicó como su declaración SQL original:
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
Una mejor manera sería insertar las filas que DESEA en otra tabla, soltar la tabla original y luego renombrar la nueva tabla para que tenga el mismo nombre que la tabla anterior
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)
Editar:
Chris saca un buen golpe de rendimiento ya que la consulta TOP 10 se ejecutará 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.