Объясните, что это удаляет лучшие 100 синтаксисов SQL

В основном я хочу сделать это:

delete top( 100 ) from table order by id asc

но MS SQL не позволяет порядок в этом положении

Общее решение, кажется, это:

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

Но я также нашел этот метод здесь:

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

который имеет намного лучший предполагаемый план выполнения (74:26). К сожалению, я действительно не понимаю синтаксис, кто-то может объяснить это мне?

Всегда интересовавшийся любыми другими методами для достижения того же результата также.

Править: Я все еще не получаю его, я боюсь, я хочу смочь считать запрос, когда я считал первые два, которые являются практически английскими. Вышеупомянутые запросы мне:

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

Я не могу изменить третий в логическое английское предложение... Я предполагаю то, что я пытаюсь достигнуть, то, как делает это превращается, "удаляют из таблицы (эта партия записей)". 'От', кажется, находится в нелогичном положении, и второе упоминание о 'таблице' является логически лишним (мне).

7
задан Patrick 16 June 2010 в 13:38
поделиться

3 ответа

Команда delete принимает несколько похожих форм, поскольку ключевое слово from является необязательным, а таблица удаления может быть указана отдельно от запроса, выбирающего записи:

delete table where ...

delete from table where ...

delete table from <query...>

delete from table from <query...>

Идея с последними двумя состоит в том, что вы можете сначала определить, из какой таблицы удалить, а затем вы можете указать запрос, который выбирает записи для удаления. Запрос может присоединяться к другим таблицам, поэтому вам нужно будет отдельно определять, из какой таблицы удалять.

В найденном вами запросе просто используется подзапрос для выбора записей для удаления.

2
ответ дан 7 December 2019 в 01:16
поделиться

Это хорошо объяснено здесь (В статье говорится об использовании представления, но я предполагаю, что та же логика должна быть применима к вашему запросу, если вы получаете лучший план выполнения)

первый читает "удаленную" часть таблицы дважды. Один раз, чтобы определить строки для удаления, а затем еще раз чтобы выполнить удаление.

Второй вариант позволяет избежать этого.

Редактировать Похоже, что это больше вопрос о синтаксисе. Синтаксис для delete описан здесь.

Релевантный фрагмент

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

Ваш запрос таков

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

Вы используете производную таблицу, поэтому вам нужен FROM . Вы опускаете первый необязательный FROM.

5
ответ дан 7 December 2019 в 01:16
поделиться

То, что вы хотите сделать, это метод, называемый Fast Ordered Delete .

Взгляните на следующую запись в блоге: Выполнение операций быстрого удаления SQL Server

3
ответ дан 7 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: