5

我知道这个话题在此之前已经多次出现,但没有一个建议的解决方案适用于我的数据集,因为我的笔记本电脑由于内存问题或存储空间已满而停止计算。

我的表如下所示,并且有108Mio 行:

Col1       |Col2   |  Col3           |Col4   |SICComb |  NameComb 

Case New   |3523   |  Alexander      |6799   |67993523| AlexanderCase New 
Case New   |3523   |  Undisclosed    |6799   |67993523| Case NewUndisclosed 
Undisclosed|6799   |  Case New       |3523   |67993523| Case NewUndisclosed 
Case New   |3523   |  Undisclosed    |6799   |67993523| Case NewUndisclosed 
SmartCard  |3674   |  NEC            |7373   |73733674| NECSmartCard 
SmartCard  |3674   |  Virtual NetComm|7373   |73733674| SmartCardVirtual NetComm 
SmartCard  |3674   |  NEC            |7373   |73733674| NECSmartCard

唯一的列是SICCombNameComb。我试图添加一个主键:

ALTER TABLE dbo.test ADD ID INT IDENTITY(1,1)

30但是整数在新的几分钟内就填满了超过GB 的存储空间。

哪种方法是从表中删除重复项的最快和最有效的方法?

4

2 回答 2

7

如果您使用的是 SQL Server,则可以使用从公用表表达式中删除:

with cte as (
    select row_number() over(partition by SICComb, NameComb order by Col1) as row_num
    from Table1
)
delete
from cte
where row_num > 1

在这里,所有行都将被编号,您可以为每个独特的SICComb+组合获得自己的序列NameComborder by您可以通过在over子句内进行选择来选择要删除的行。

于 2013-08-24T11:58:37.457 回答
2

通常,从表中删除重复项的最快方法是将记录(没有重复项)插入到临时表中,截断原始表并将它们重新插入。

这是使用 SQL Server 语法的想法:

select distinct t.*
into #temptable
from t;

truncate table t;

insert into t
    select tt.*
    from #temptable;

当然,这在很大程度上取决于第一步的速度。而且,您需要有空间来存储同一张表的两个副本。

请注意,创建临时表的语法因数据库而异。有些使用create table as而不是语法select into

编辑:

您的身份插入错误很麻烦。我认为您需要从不同的列列表中删除身份。或者做:

select min(<identity col>), <all other columns>
from t
group by <all other columns>

如果您有一个标识列,则没有重复项(根据定义)。

最后,您将需要决定要为行使用哪个 id。如果您可以为行生成一个新的 id,那么只需将标识列从插入的列列表中移除:

insert into t(<all other columns>)
    select <all other columns>;

如果您需要旧的身份值(并且最小值就可以),请关闭身份插入并执行以下操作:

insert into t(<all columns including identity>)
    select <all columns including identity>;
于 2013-08-24T11:41:55.710 回答