我有一个约有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.
我猜这是因为我可以有这样的记录:
因此删除空格会失败,因为这两个记录会重复。
无论如何我仍然可以在不更新任何会导致重复的记录的情况下执行此命令吗?
非常感谢任何帮助!
答案 0 :(得分: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
小提琴更新(类似于删除)
答案 1 :(得分: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;
答案 2 :(得分:0)
我假设您这样做是因为数据是手动输入的,或者是由尚未清理输入的应用程序输入的,然后检查现有记录。
一个解决方案,相当复杂,是添加一个WHERE子句,搜索与清理后的字符串匹配的任何内容,然后将其排除。