2010-06-16 4 views
7

Básicamente quiero hacer esto:favor explicar esto elimina la parte superior de sintaxis SQL 100

delete top(100) from table order by id asc 

pero MS SQL no permite orden en esta posición

La solución común parece ser la siguiente:

DELETE table WHERE id IN(SELECT TOP (100) id FROM table ORDER BY id asc) 

Pero también encontré este método here:

delete table from (select top (100) * from table order by id asc) table 

que tiene un plan de ejecución mucho mejor estimado (74:26). Desafortunadamente, realmente no entiendo la sintaxis, por favor, ¿alguien puede explicarme?

Siempre interesado en otros métodos para lograr el mismo resultado también.

EDIT: Todavía no lo entiendo Tengo miedo, quiero poder leer la consulta mientras leo los dos primeros que son prácticamente ingleses. Las consultas anteriores para mí son:

delete the top 100 records from table, with the records ordered by id ascending 
delete the top 100 records from table where id is anyone of (this lot of ids) 
delete table from (this lot of records) table 

No puedo cambiar el tercero en una frase Inglés lógica ... Creo que lo que estoy tratando de llegar es ¿Cómo funciona esto a su vez en "borrar de la tabla (Esta gran cantidad de registros) ". El 'desde' parece estar en una posición ilógica y la segunda mención de 'tabla' es lógicamente superflua (para mí).

Respuesta

2

El comando delete toma varias formas similares, como la palabra clave from es opcional, y la mesa de eliminación se puede especificar por separado de la consulta seleccionando los registros:

delete table where ... 

delete from table where ... 

delete table from <query...> 

delete from table from <query...> 

La idea con los dos últimos es que primero puede definir qué tabla eliminar, luego puede especificar una consulta que seleccione los registros para eliminar. La consulta se puede unir en otras tablas, por eso es necesario definir por separado desde qué tabla eliminar.

La consulta que encontró solo utiliza una subconsulta para seleccionar los registros que desea eliminar.

+0

No puedo coincidir con uno de sus 4 sintaxis con el tercer ejemplo, que dice a mí como "tabla Eliminar en la tabla subtabla". Por favor, mira mi edición de la pregunta. – Patrick

+0

@Patrick: puede agregar el 'de' opcional a su consulta (la diferencia entre la 3ra y 4ta forma anterior) para que se lea más lógicamente. Ajusté los formularios de arriba para ser más descriptivo. – Guffa

+0

@Patrick: la consulta podría describirse en inglés como "eliminar todos los registros de la tabla que coincidan con los registros (en este lote de registros se llama 'tabla')". Tenga en cuenta que la última "tabla" en la consulta es un alias, no el nombre real de la tabla. – Guffa

5

Esto se explica así here (El artículo habla sobre el uso de una vista, pero supongo que el mismo razonamiento debe aplicarse a la consulta si usted está consiguiendo un mejor plan de ejecución)

la primera uno lee el “borrado " parte de la tabla dos veces. Una vez para identificar las filas para eliminar y luego una vez más para realizar la eliminación.

El segundo elemento evita esto.

Editar Esto parece ser más una pregunta acerca de la sintaxis. La sintaxis para eliminar es described here.

El bit relevante es

DELETE 
    [ FROM ] 
    { <object> | rowset_function_limited 
    } 
    [ FROM <table_source> [ ,...n ] ] 

Su consulta es

delete alias 
from 
    (select top (100) * 
    from table 
    order by id asc) alias 

Está utilizando una tabla derivada por lo tanto necesitan el FROM <table_source>. Está omitiendo la primera opción FROM.

Cuestiones relacionadas