SQL删除带有group by子句

时间:2019-02-25 17:10:41

标签: sql sql-server

我想编写一条SQL命令,该命令将删除所有行,其中一列的最后一位为0,最后一位为1,最后一位为2,依此类推。

delete from BASE_TABLE where SET = 'ABCD'

该语句将立即删除400,000+行,而我的服务无法处理。

要分解它,我想说类似

delete from BASE_TABLE
where BASE_TABLE.SET = 'ABCD'
and BASE_TABLE.TAG LIKE '%0'

在我使用LIKE '%0'删除所有内容后,我想一直使用LIKE '%1'删除所有内容,

这可能吗?

3 个答案:

答案 0 :(得分:4)

您可以在while循环中执行此操作。但是,更典型的方法是:

delete top 10 percent from BASE_TABLE
where BASE_TABLE.SET = 'ABCD';

或者,您可以处理一个固定的数字:

delete top 1000 from BASE_TABLE
where BASE_TABLE.SET = 'ABCD';

然后可以将其循环:

declare @x int;
set @x = 1;

while @x > 0 begin
    delete top 1000 from BASE_TABLE
    where BASE_TABLE.SET = 'ABCD';

    set @x = @@ROWCOUNT;
end;

不要将percent方法放在while循环中。它将持续很长时间-因为百分比基于当时表中的行。我相信它将最终删除最后一行,但是会有很多迭代。

答案 1 :(得分:1)

如果您只关心系统负载,只需删除顶部的X行。这是语法

DELETE TOP (top_value) [ PERCENT ] 
FROM table
[WHERE conditions];

如果要按特定顺序删除,可以应用订单。如果您希望该过程为您完成所有工作,请将其循环放置直到表为空。

答案 2 :(得分:1)

您需要[0-9]%中的where clause

这将删除所有以0 to 9开头的行,如果要以%结尾的行向左移动, %[0-9]