Как удалить верхние 1000 строк из таблицы с помощью Sql Server 2008?

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

вот код:

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

6 ответов


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

вы не определите TOP как приказано чем.

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

;WITH CTE AS
(
SELECT TOP 1000 *
FROM [mytab]
ORDER BY a1
)
DELETE FROM CTE

может быть лучше для 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 за упоминание и требование более четкого и точного ответа.


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

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


delete from [mytab]
where [mytab].primarykeyid in
(
select top 1000 primarykeyid
from [mytab]
)

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

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

заменить YourTABLE на имя таблицы, XX число, например 1000, pk - имя поля первичного ключа таблицы.


SET ROWCOUNT 1000;

DELETE FROM [MyTable] WHERE .....