Jak usunąć 1000 najlepszych wierszy z tabeli za pomocą Sql Server 2008?

Mam tabelę w SQL serverze. Chciałbym usunąć z niego 1000 pierwszych wierszy. Jednak próbowałem tego, ale zamiast po prostu usuwać najlepsze wiersze 1000, usunął wszystkie wiersze w tabeli.

Oto kod:

delete from [mytab] 
select top 1000 
a1,a2,a3
from [mytab]
Author: Brian Tompsett - 汤莱恩, 2012-01-21

6 answers

Kod, który próbowałeś, to w rzeczywistości dwa stwierdzenia. A DELETE, po którym następuje a SELECT.

Nie definiujesz TOP według czego.

Dla określonych kryteriów porządkowania usunięcie z CTE lub podobnego wyrażenia tabeli jest najbardziej efektywnym sposobem.

;WITH CTE AS
(
SELECT TOP 1000 *
FROM [mytab]
ORDER BY a1
)
DELETE FROM CTE
 158
Author: Martin Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-15 14:56:14

Może być lepiej dla sql2005+ używać:

DELETE TOP (1000)
FROM [MyTab]
WHERE YourConditions

Dla Sql2000:

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

Ale

Jeśli chcesz usunąć określony podzbiór wierszy zamiast dowolnego podzbioru, powinieneś jawnie określić kolejność zapytań podrzędnych:

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

Dzięki tp @gbn za wzmiankę i domaganie się bardziej jasnej i dokładnej odpowiedzi.

 66
Author: Oleg Dok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-22 08:40:04

Jak zdefiniowano w poniższym linku, możesz usunąć w prosty sposób

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

 20
Author: Rishi Bhatnagar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-02 11:00:59
delete from [mytab]
where [mytab].primarykeyid in
(
select top 1000 primarykeyid
from [mytab]
)
 6
Author: Jason Dam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-21 19:19:23

Jest szybki. Spróbuj:

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

Zastąp {[1] } nazwą tabeli, XX przez liczbę, na przykład 1000, pk to nazwa podstawowego pola klucza w tabeli.

 2
Author: Hamed elahi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-02 09:57:20
SET ROWCOUNT 1000;

DELETE FROM [MyTable] WHERE .....
 1
Author: Joe Bourne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-14 11:55:45