Как удалить первые 1000 строк из таблицы, используя Sql Server 2008? - PullRequest
94 голосов
/ 21 января 2012

У меня есть таблица в SQL Server.Я хотел бы удалить первые 1000 строк из него.Однако я попробовал это, но вместо того, чтобы просто удалить первые 1000 строк, он удалил все строки в таблице.

Вот код:

delete from [mytab] 
select top 1000 
a1,a2,a3
from [mytab]

Ответы [ 6 ]

179 голосов
/ 21 января 2012

Код, который вы пробовали, фактически является двумя утверждениями.A DELETE, за которым следует SELECT.

Вы не определяете TOP как упорядоченный по чем.

Для удаления определенных критериев заказа из CTE или подобное табличное выражение является наиболее эффективным способом.

;WITH CTE AS
(
SELECT TOP 1000 *
FROM [mytab]
ORDER BY a1
)
DELETE FROM CTE
75 голосов
/ 21 января 2012

Может быть лучше для sql2005 + использовать:

DELETE TOP (1000)
FROM [MyTab]
WHERE YourConditions

Для Sql2000:

DELETE FROM [MyTab]
WHERE YourIdField IN 
(
  SELECT TOP 1000 
    YourIdField 
  FROM [MyTab]
  WHERE YourConditions
)

НО

Если вы хотите удалить специфическое подмножество строк вместо произвольного подмножества, вы должны явно указать порядок подзапроса:

DELETE FROM [MyTab]
WHERE YourIdField IN 
(
  SELECT TOP 1000 
    YourIdField 
  FROM [MyTab]
  WHERE YourConditions
  ORDER BY ExplicitSortOrder
)

Спасибо tp @gbn за упоминание и требование более ясного и точного ответа.

24 голосов
/ 17 января 2015

Как указано в ссылке ниже, вы можете удалить прямым способом

USE AdventureWorks2008R2;
GO
DELETE TOP (20) 
FROM Purchasing.PurchaseOrderDetail
WHERE DueDate < '20020701';
GO

http://technet.microsoft.com/en-us/library/ms175486(v=sql.105).aspx

6 голосов
/ 21 января 2012
delete from [mytab]
where [mytab].primarykeyid in
(
select top 1000 primarykeyid
from [mytab]
)
2 голосов
/ 14 апреля 2015

Это быстро. Попробуйте:

DELETE FROM YourTABLE
FROM (SELECT TOP XX PK FROM YourTABLE) tbl
WHERE YourTABLE.PK = tbl.PK

Заменить YourTABLE именем таблицы, XX по номеру, например 1000, pk - это имя поля первичного ключа вашей таблицы.

1 голос
/ 14 марта 2014
SET ROWCOUNT 1000;

DELETE FROM [MyTable] WHERE .....
...