1

約 30 万件のレコードを含む電話データベースがあります。

私がやりたいことは、次のように空白を削除することです:-

update SMSTelephone set
Telephone = replace(Telephone, ' ', '')

問題は、これを行うと次のエラーが発生することです:-

Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK_SMSTelephone'. Cannot insert duplicate key in     object 'dbo.SMSTelephone'.
The statement has been terminated.

この理由は、次のようなレコードを作成できるためだと思います。

  1. 077 7777 7777
  2. 07777777777

これらの 2 つのレコードが重複するため、空白を削除すると失敗します。

とにかく、重複の原因となるレコードを更新せずに、このコマンドを実行できますか?

どんな助けでも大歓迎です!

4

3 に答える 3

2

これを試して:

update ST set
  Telephone = replace(st.Telephone, ' ', '')
from SMSTelephone st
cross apply (select count(*) as cnt
             from SMSTelephone sti
             where replace(st.Telephone, ' ', '')=replace(sti.Telephone, ' ', '')) i
where i.cnt=1

それらの1つを更新するには:

WITH CTE (Telephone,DuplicateCount)
AS
(
  SELECT Telephone,
  ROW_NUMBER() OVER(PARTITION BY replace(Telephone, ' ', '') ORDER BY len(Telephone)) AS DuplicateCount
  FROM SMSTelephone
)
update CTE
set Telephone = replace(Telephone, ' ', '')
WHERE DuplicateCount = 1

1 つを残してすべて削除するには:

WITH CTE (Telephone,DuplicateCount)
AS
(
  SELECT Telephone,
  ROW_NUMBER() OVER(PARTITION BY replace(Telephone, ' ', '') ORDER BY len(Telephone)) AS DuplicateCount
  FROM SMSTelephone
)
delete from CTE
WHERE DuplicateCount > 1

更新用のフィドル(同様に削除用)

http://sqlfiddle.com/#!3/9e117/2/0

于 2013-03-06T15:12:54.030 に答える
1

その列が有効な PK であるためには、入力データが実際にサニタイズされている必要があります (DBA の講義は終了しました)。

単一列テーブルの場合、通常はクリーン データ用のミラー テーブルを作成します。

CREATE TABLE SMSTelephoneBak
( Telephone VARCHAR(20)
);

クリーンなデータを挿入します。

INSERT into SMSTelephoneBak
SELECT DISTINCT REPLACE(telephone,' ','') FROM dbo.SMSTelephone;

ソース テーブルをクリアします。

TRUNCATE TABLE dbo.SMSTelephone;

クレンジングされたデータを挿入します。

INSERT INTO dbo.SMSTelephone 
        ( Telephone )
SELECT Telephone FROM dbo.SMSTelephoneBak;

最後に、一時テーブルを削除します。

DROP TABLE dbo.SMSTelephonebak;
于 2013-03-06T16:20:42.330 に答える
0

データが手動で入力されたか、入力をサニタイズせずに既存のレコードをチェックしていないアプリケーションによってデータが入力されたため、これを行っていると思います。

解決策はかなり複雑ですが、クリーンアップされた文字列に一致するものを検索して除外する WHERE 句を追加することです。

于 2013-03-06T15:15:34.113 に答える