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

因此删除空格将失败,因为这两条记录将被重复。

无论如何我仍然可以执行此命令,同时不更新任何会导致重复的记录?

任何帮助将非常感激!

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

要更新其中之一:

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

要删除除一个以外的所有内容:

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 回答