更新多行,但如果值已存在则不会

时间:2014-10-14 06:42:11

标签: sql-server sql-update

我有这张桌子:

CREATE TABLE PhoneNumbers (
    PhoneNumber varchar(15) PRIMARY KEY
    DateTimeAdded datetimeoffset
)

PhoneNumber列包含E.164格式的电话号码。

有一个问题是少数数字缺少其国家/地区前缀,因此我需要运行UPDATE查询,其中添加“+1”或“+44”或其他前缀(对于本练习,我知道他们都需要“+1”作为前缀(所以不要担心“+44”和其他国家/地区代码。

我想到了这个:

UPDATE PhoneNumbers
SET PhoneNumber = '1' + PhoneNumber
WHERE
    LEN( PhoneNumber ) = 10
    AND
    PhoneNumber NOT LIKE '1%'

这个SQL原则上运行良好,除了在后续点正确输入了一些数字,因此SQL因主键冲突而失败。

我可以运行的UPDATE查询是什么,在执行实际更新之前检查结果值是否已存在?

我想到了这个:

UPDATE PhoneNumbers
SET PhoneNumber = '1' + PhoneNumber
WHERE
    LEN( PhoneNumber ) = 10
    AND
    PhoneNumber NOT LIKE '1%'
    AND NOT EXISTS ( SELECT * FROM PhoneNumbers As P2 WHERE P2.PhoneNumber = '1' + Number )

但子查询不能按预期工作。我尝试UPDATE PhoneNumbers As P1并在子查询中引用P1,但SQL Server说这是错误的语法。

2 个答案:

答案 0 :(得分:3)

在您的相关子查询中,您忘记将电话号码与外部表关联起来;所以你的子查询应该是(未经测试的):

AND NOT EXISTS ( SELECT * FROM PhoneNumbers As P2 WHERE P2.PhoneNumber = '1' + PhoneNumbers.PhoneNumber)

答案 1 :(得分:0)

你也可以达到这样的目标: -

UPDATE p1
SET PhoneNumber = '1' + PhoneNumber
from PhoneNumbers p1
left join PhoneNumbers p2 on p1.PhoneNumber='1'+P2.PhoneNumbers
WHERE
    and p2.phonenumber is null
    and LEN( PhoneNumber ) = 10
    AND
    PhoneNumber NOT LIKE '1%'