SQL Serverにテーブルがあります。上位1000行を削除したいと思います。ただし、これを試しましたが、上位1000行を削除する代わりに、テーブル内のすべての行を削除しました。
コードは次のとおりです。
delete from [mytab]
select top 1000
a1,a2,a3
from [mytab]
試したコードは、実際には2つのステートメントです。 DELETE
の後にSELECT
が続きます。
TOP
をwhatの順序で定義しないでください。
特定の順序付け条件の場合、 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
)
しかし
任意のサブセットではなくspecific行のサブセットを削除する場合、サブクエリの順序を明示的に指定する必要があります。
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 .....