web-dev-qa-db-ja.com

SQL Server 2008を使用してテーブルから上位1000行を削除するにはどうすればよいですか?

SQL Serverにテーブルがあります。上位1000行を削除したいと思います。ただし、これを試しましたが、上位1000行を削除する代わりに、テーブル内のすべての行を削除しました。

コードは次のとおりです。

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

試したコードは、実際には2つのステートメントです。 DELETEの後にSELECTが続きます。

TOPをwhatの順序で定義しないでください。

特定の順序付け条件の場合、 CTE または同様のテーブル式から削除するのが最も効率的な方法です。

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

Sql2005 +の方が使いやすい場合があります。

DELETE TOP (1000)
FROM [MyTab]
WHERE YourConditions

Sql2000の場合:

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

しかし

任意のサブセットではなくspecific行のサブセットを削除する場合、サブクエリの順序を明示的に指定する必要があります。

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

より明確で正確な回答に言及し、要求してくれたtp @gbnに感謝します。

75
Oleg Dok

以下のリンクで定義されているように、簡単に削除できます

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

24
Rishi Bhatnagar
delete from [mytab]
where [mytab].primarykeyid in
(
select top 1000 primarykeyid
from [mytab]
)
6
Jason Dam

速いです。それを試してみてください:

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

YourTABLEをテーブル名に、XXを1000などの数字に置き換えます。pkは、テーブルの主キーフィールドの名前です。

2
Hamed elahi
SET ROWCOUNT 1000;

DELETE FROM [MyTable] WHERE .....
1
Joe Bourne