我在 SQL Server 中有一个表。我想从中删除前1000行。然而,我尝试了这个代码,但它不仅删除了前1000行,还删除了表中的所有行。
下面是代码:
delete from [mytab]
select top 1000
a1,a2,a3
from [mytab]
我在 SQL Server 中有一个表。我想从中删除前1000行。然而,我尝试了这个代码,但它不仅删除了前1000行,还删除了表中的所有行。
下面是代码:
delete from [mytab]
select top 1000
a1,a2,a3
from [mytab]
DELETE
,然后是一个 SELECT
。TOP
。;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
)
BUT
如果您想要删除一个特定的子集,而不是任意的子集,您应该明确指定子查询的顺序:
DELETE FROM [MyTab]
WHERE YourIdField IN
(
SELECT TOP 1000
YourIdField
FROM [MyTab]
WHERE YourConditions
ORDER BY ExplicitSortOrder
)
感谢 @gbn 提出并要求更清晰、更准确的答案。
如下链接所定义,您可以以直接的方式进行删除。
USE AdventureWorks2008R2;
GO
DELETE TOP (20)
FROM Purchasing.PurchaseOrderDetail
WHERE DueDate < '20020701';
GO
http://technet.microsoft.com/zh-cn/library/ms175486(v=sql.105).aspx
delete from [mytab]
where [mytab].primarykeyid in
(
select top 1000 primarykeyid
from [mytab]
)
SET ROWCOUNT 1000;
DELETE FROM [MyTable] WHERE .....
它速度快。来试试:
DELETE FROM YourTABLE
FROM (SELECT TOP XX PK FROM YourTABLE) tbl
WHERE YourTABLE.PK = tbl.PK
将YourTABLE
替换为表名,
XX
替换为数字,例如1000,
pk
是您的表的主键字段的名称。
我同意 Hamed elahi 和 Glorfindel 的观点。
我的建议是您可以使用别名删除和更新
/*
given a table bi_customer_actions
with a field bca_delete_flag of tinyint or bit
and a field bca_add_date of datetime
note: the *if 1=1* structure allows me to fold them and turn them on and off
*/
declare
@Nrows int = 1000
if 1=1 /* testing the inner select */
begin
select top (@Nrows) *
from bi_customer_actions
where bca_delete_flag = 1
order by bca_add_date
end
if 1=1 /* delete or update or select */
begin
--select bca.*
--update bca set bca_delete_flag = 0
delete bca
from (
select top (@Nrows) *
from bi_customer_actions
where bca_delete_flag = 1
order by bca_add_date
) as bca
end
为了增强已接受的答案代码,请查看我的代码。 代码将从表中每次删除1000行,然后在每次迭代后将批处理大小增加10%。 这样,随着表变小,代码将删除更多的行并减少所需的循环次数。 变量@count仍将存储每个删除语句影响的行数,并且当其变为零时,循环将停止。
DECLARE @batch_size INT = 10000
DECLARE @count INT = 1
WHILE @count > 0
BEGIN
;WITH CTE AS
(
SELECT TOP (@batch_size) *
FROM [mytab]
ORDER BY a1
)
DELETE FROM CTE
SET @count = @@ROWCOUNT
-- Increase the batch size by 10% after each iteration
SET @batch_size = @batch_size * 1.1
END
delete top(1000)
from [mytab]
where
condition[1]
condition[2]
.
.
condition[n]
delete from [mytab]
是一个语句,而select top ...
是另一个语句,所以您删除了整个表。 - Nick Chammas