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ここでは、すべての行に番号が付けられ、 +の一意の組み合わせごとに独自のシーケンスが取得されますNameComb。節order 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;

もちろん、これは最初のステップの速さに大きく依存します。また、同じテーブルの 2 つのコピーを格納するスペースが必要です。

一時テーブルを作成するための構文は、データベースによって異なることに注意してください。create table asではなくの構文を使用するものもありますselect into

編集:

ID 挿入エラーは厄介です。個別の列のリストから ID を削除する必要があると思います。または、次のようにします。

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

ID 列がある場合、(定義により) 重複はありません。

最後に、行に必要な ID を決定する必要があります。行の新しい ID を生成できる場合は、ID 列を列リストから除外して挿入します。

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

古い ID 値が必要な場合 (最小値で十分です)、ID 挿入をオフにして、次のようにします。

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