如何使用Sql Server 2008从表中删除前1000行?

cMi*_*nor 97 sql sql-server sql-delete

我在SQL Server中有一个表.我想从中删除前1000行.但是,我尝试了这个,但我没有删除前1000行,而是删除了表中的所有行.

这是代码:

delete from [mytab] 
select top 1000 
a1,a2,a3
from [mytab]
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 182

您尝试的代码实际上是两个语句.A DELETE接着是a SELECT.

您没有TOP按照什么定义.

对于从CTE或类似表中删除的特定排序标准,表达式是最有效的方式.

;WITH CTE AS
(
SELECT TOP 1000 *
FROM [mytab]
ORDER BY a1
)
DELETE FROM CTE
Run Code Online (Sandbox Code Playgroud)

  • 对于那些想知道为什么你不能做`DELETE TOP(1000)FROM ORDER BY column`的人,[请阅读](http://msdn.microsoft.com/en-us/library/ms189463.aspx):"用于INSERT,UPDATE,MERGE或DELETE的TOP表达式中引用的行不按任何顺序排列." (13认同)
  • @Joe [在将来的SQL Server发行版中使用SET ROWCOUNT不会影响DELETE,INSERT和UPDATE语句.避免在新的开发工作中使用SET ROWCOUNT和DELETE,INSERT和UPDATE语句,并计划修改当前使用它的应用程序.](http://technet.microsoft.com/en-us/library/ms188774.aspx) (6认同)
  • @Liam - 只是因为如果在CTE之前有任何先前的陈述,则需要用分号终止,因此将其附加到"WITH"的前面会预先处理那些没有这样做的人的投诉. (4认同)
  • @Magnus是的.不过2000年.可能在2000年使用派生表.我没有一个实例来测试. (3认同)
  • 我做了一个稍微不同的方式(虽然我认为CTE可能更好看):DELETE T1 FROM(选择TOP 1000*来自[MYTAB] ORDER BY A1)T1; (2认同)

Ole*_*Dok 78

可能更适合sql2005 +使用:

DELETE TOP (1000)
FROM [MyTab]
WHERE YourConditions
Run Code Online (Sandbox Code Playgroud)

对于Sql2000:

DELETE FROM [MyTab]
WHERE YourIdField IN 
(
  SELECT TOP 1000 
    YourIdField 
  FROM [MyTab]
  WHERE YourConditions
)
Run Code Online (Sandbox Code Playgroud)

如果要删除特定的行子集而不是任意子集,则应明确指定子查询的顺序:

DELETE FROM [MyTab]
WHERE YourIdField IN 
(
  SELECT TOP 1000 
    YourIdField 
  FROM [MyTab]
  WHERE YourConditions
  ORDER BY ExplicitSortOrder
)
Run Code Online (Sandbox Code Playgroud)

感谢tp @gbn提及并要求更清晰准确的答案.

  • @gbn如果您正在寻找没有ORDER BY的TOP的有效使用:我带来的是我需要删除符合某些条件的所有行,但出于性能原因,我不希望它删除超过10,000行一次.我不关心它删除哪些行,因为我将以某个间隔再次运行命令,直到所有这些行都消失. (8认同)
  • @gbn对你来说也许没用,但这仍然是问题所要求的. (3认同)

Ris*_*gar 24

如下面的链接中所定义,您可以直接删除

USE AdventureWorks2008R2;
GO
DELETE TOP (20) 
FROM Purchasing.PurchaseOrderDetail
WHERE DueDate < '20020701';
GO
Run Code Online (Sandbox Code Playgroud)

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


Jas*_*Dam 6

delete from [mytab]
where [mytab].primarykeyid in
(
select top 1000 primarykeyid
from [mytab]
)
Run Code Online (Sandbox Code Playgroud)

  • 无用:没有ORDER BY的TOP会产生任意行 (4认同)
  • @gbn对你来说也许没用,但这仍然是问题所要求的. (4认同)
  • @gbn我没有声称有任何默认的排序顺序或查询甚至在任何方面都有用,我只是提醒你,问题没有要求,所以你建议订购什么? (3认同)
  • @gbn我不知道为什么你会因为某个起点而对所有人充满敌意.我并不认为我的答案是最终结果,这只是一个帮助某人的建议.我认为重要的是这里从子查询返回的键. (2认同)
  • 这可能是提问者正在寻找的全部内容.我只是为其他人添加一条注释,以强调由这样的语句删除的行不保证按任何顺序排列. (2认同)