首页 > 解决方案 > SQL 计数唯一删除集

问题描述

我目前在我的数据库中有一个简单的表来存储集合和值。我希望能够删除数据库中的所有条目并返回已删除的不同集的数量。

 create table sets(
      SetId varchar(50)
      Value int
 )

如果我有两组,每组都有两个值,那么表格将被加载四个条目。

 Set1, 0
 Set1, 1
 Set2, 0
 Set2, 1

如果我删除所有我希望能够计算删除的唯一 SetId 的所有内容,那么在上面的示例中它应该返回 2。

现在我可以通过创建一个包含已删除 SetIds 的 tempTable 来完成此操作,然后我计算不同的

CREATE TABLE #temp
(
    SetId varchar(50)
);

delete from Sets
    OUTPUT DELETED.SetId INTO #temp

select count(distinct SetId) from #temp;

有没有更好的方法来完成这个而不必使用临时表?

标签: sqlsql-server

解决方案


如果您有很多行,并且想要避免使用临时表(大量 IO):

declare @cnt int;

set xact_abort on
begin transaction

begin try
    select @cnt = count(distinct SetId) from sets;
    delete from sets;    
    commit transaction
end try
begin catch
    rollback;
end catch

或者 :

declare @cnt int;

set xact_abort on
begin transaction

begin try
    select @cnt = count(distinct SetId) from sets;
    truncate table sets
    commit transaction
end try
begin catch
    rollback;
end catch

推荐阅读