我有这张桌子:
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说这是错误的语法。
答案 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%'