首页 > 解决方案 > 用更新声明回答我

问题描述

我有 101 条记录。前缀是一列。[保险电话] 就像 589-652-5256 我错误地做了

Substring ( EE.[Insurance Phone],4,3)

结果为 -65,我希望它为 652 所以我正在为此编写更新语句。对于 101 条记录,我有不同的电话号码。当我执行一个选择语句时,我得到了每一行中间的 3 个数字,但是如果我使用更新语句,那么 625 [101 条记录的第一条记录] 号将更新为所有 101 条记录。下面是 select 和 update 语句。

select 
    IC.COMPANY_NAME, EE.[Insurance Name], 
    substring (EE.[Insurance Phone], 5, 3) as phone
from
    Insurance_Companies_28012020 EE 
join 
    INS_COMPANIES IC on EE.[Insurance Name] = IC.COMPANY_NAME 
where 
    ic.IS_ACTIVE = 1 
    and [Insurance Phone] is not null

update BUSINESS_PHONE_NUMBERS 
set PREFIX = substring(EE.[Insurance Phone], 5, 3)
from Insurance_Companies_28012020 EE 
join INS_COMPANIES IC on EE.[Insurance Name] = IC.COMPANY_NAME 
where ic.IS_ACTIVE = 1 and [Insurance Phone] is not null

标签: sql-server

解决方案


我想您的查询应该如下所示:

update  t1
set     t1.PREFIX = substring(EE.[Insurance Phone], 5, 3)
from    BUSINESS_PHONE_NUMBERS t1
inner join Insurance_Companies_28012020 EE on ee.KEY_COLUMN = t1.KEY_COLUMN -- here you should link these two tables
inner join INS_COMPANIES IC on EE.[Insurance Name] = IC.COMPANY_NAME 
where   ic.IS_ACTIVE = 1
        and [Insurance Phone] is not null

编辑

您的 update 语句没有链接表BUSINESS_PHONE_NUMBERSInsurance_Companies_28012020,这会在执行计划中产生笛卡尔积,从而导致最终更新结果的奇怪行为。您会遇到这种情况:您需要更新 N 行,但您有 N*M 行以及所有可能的组合。很难说会选择其中哪一个来更新。在您的情况下,它是Insurance_Companies_28012020表中的第一条记录。

此外,在您的UPDATE语句中,您可以将条件添加到WHERE子句:BUSINESS_PHONE_NUMBERS.KEY_COLUMN = EE.KEY_COLUMN。这应该给出与我的UPDATE.


推荐阅读