varios vaciar una tablas tabla relacionadas registros existe eliminar datos campos borrar sql

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.