Вам понадобится другой способ определения строк, которые нужно удалить, например, наличие BatchID или чего-то еще. Люди обычно используют для этого промежуточную таблицу, чтобы крупные массовые операции не мешали нормальному использованию, а также, чтобы, когда дела пошли на юг, вы могли просто усечь и начать все сначала.
Чтобы показать, что TOP не заботится о «последнем»:
CREATE TABLE #foo(id int IDENTITY(1,1) PRIMARY KEY, name sysname);
INSERT #foo(name) VALUES('Bob');
INSERT #foo(name) VALUES('Frank');
INSERT #foo(name) VALUES('Aaron');
INSERT #foo(name) VALUES('William');
INSERT #foo(name) VALUES('Mary');
DELETE TOP (2) FROM #foo;
SELECT * FROM #foo;
DROP TABLE #foo;
Результаты:
id name
-- -------
3 Aaron
4 William
5 Mary
Это удаляло первых двух, которые были вставлены (и просто случайно были назначены целочисленные значения). Теперь попробуйте это:
CREATE TABLE #foo(id int PRIMARY KEY, name sysname);
INSERT #foo(id,name) VALUES(3,'Bob');
INSERT #foo(id,name) VALUES(12,'Frank');
INSERT #foo(id,name) VALUES(84,'Aaron');
INSERT #foo(id,name) VALUES(16,'William');
INSERT #foo(id,name) VALUES(7,'Mary');
DELETE TOP (2) FROM #foo;
SELECT * FROM #foo;
DROP TABLE #foo;
Результаты:
id name
-- -------
12 Frank
16 William
84 Aaron
Различные строки были удалены. Теперь измените CREATE
на:
CREATE TABLE #foo(id int, name sysname UNIQUE);
Та же вставка + удаление выходов:
id name
-- -------
84 Aaron
16 William
7 Mary
Стол не заказан. TOP без ORDER BY (фактически любой запрос без ORDER BY) следует считать произвольным (возможно, даже полезно думать о нем как о случайном).