SQL更新(简单??)

SQL更新(简单??),sql,sql-server,tsql,sql-update,Sql,Sql Server,Tsql,Sql Update,我有两张桌子 表客户: id, CustomerName 表CustomerMapping ID WrongName, CorrectedName 我想做的是: 如果TableCustomers.CustomerName=TableCustomerMapping.ErrorName,则使用TableCustomerMapping.CorrectName更新my TableCustomers.CustomerName 我尝试了这个update语句,但是在我放弃并取消查询之前花费了太长的时间(6

我有两张桌子

客户

id,
CustomerName
CustomerMapping

ID
WrongName,
CorrectedName
我想做的是:

如果TableCustomers.CustomerName=TableCustomerMapping.ErrorName,则使用TableCustomerMapping.CorrectName更新my TableCustomers.CustomerName

我尝试了这个update语句,但是在我放弃并取消查询之前花费了太长的时间(6分钟以上)。我不应该花那么长时间来更新1000行

这是我尝试的更新声明,我是否遗漏了什么

UPDATE i
SET i.CustomerJob = c.CorrectedName
FROM dbo.TableCustomers i
LEFT JOIN dbo.CustomerMapping c ON (i.CustomerJob = c.WrongName);
GO

也许您可以向TableCustomerMapping添加外键

**TableCustomerMapping**
___________________
ID,
fkCustomerID,
WrongName,
CorrectedName
然后使用它将两个表连接在一起,您将只更新1条记录

UPDATE i
SET i.CustomerJob = c.QBName
FROM dbo.TableCustomers i
LEFT JOIN dbo.CustomerMapping c ON (i.ID= c.fkCustomerID);
GO

也许您可以向TableCustomerMapping添加外键

**TableCustomerMapping**
___________________
ID,
fkCustomerID,
WrongName,
CorrectedName
然后使用它将两个表连接在一起,您将只更新1条记录

UPDATE i
SET i.CustomerJob = c.QBName
FROM dbo.TableCustomers i
LEFT JOIN dbo.CustomerMapping c ON (i.ID= c.fkCustomerID);
GO

我明白你想做什么。 试试这个例子:

UPDATE TABLEA
 SET b = TABLEB.b1,
     c = TABLEB.c1,
     d = TABLEB.d1
 FROM TABLEA, TABLEB
 WHERE TABLEA.a = TABLEB.a1
 AND TABLEB.e1 > 40
 GO

我希望你工作

我了解你想做什么。 试试这个例子:

UPDATE TABLEA
 SET b = TABLEB.b1,
     c = TABLEB.c1,
     d = TABLEB.d1
 FROM TABLEA, TABLEB
 WHERE TABLEA.a = TABLEB.a1
 AND TABLEB.e1 > 40
 GO

如果这两个表由
c.CustomerName=m.ErrorName
关联,我希望您能够工作

还要注意,
可能会有多个人同名或同名。考虑到这种情况(
与IDs无关),我认为以下(
内部连接或连接
)将完成这项工作

--Do this select first for safety
select c.CustomerName, m.CorrectedName
from TableCustomers c join TableCustomerMapping m on c.CustomerName = m.WrongName

--Update if okay
update c
set c.CustomerName = m.CorrectedName
from TableCustomers c join TableCustomerMapping m on c.CustomerName = m.WrongName

如果这两个表通过
c.CustomerName=m.ErrorName
关联

还要注意,
可能会有多个人同名或同名。考虑到这种情况(
与IDs无关),我认为以下(
内部连接或连接
)将完成这项工作

--Do this select first for safety
select c.CustomerName, m.CorrectedName
from TableCustomers c join TableCustomerMapping m on c.CustomerName = m.WrongName

--Update if okay
update c
set c.CustomerName = m.CorrectedName
from TableCustomers c join TableCustomerMapping m on c.CustomerName = m.WrongName

不要执行
左连接
。。。如果这样做,您将更新
Customers
表中的每条记录,并将所有不匹配的记录设置为
NULL
。。。相反,执行
内部联接

UPDATE c
SET c.CustomerName = cm.CorrectedName
FROM dbo.Customers c
INNER JOIN dbo.CustomerMapping cm ON (c.CustomerName = cm.WrongName);

不要执行
左连接
。。。如果这样做,您将更新
Customers
表中的每条记录,并将所有不匹配的记录设置为
NULL
。。。相反,执行
内部联接

UPDATE c
SET c.CustomerName = cm.CorrectedName
FROM dbo.Customers c
INNER JOIN dbo.CustomerMapping cm ON (c.CustomerName = cm.WrongName);

问题是您正在比较字符串。很可能字符串列没有索引,因此对于表“TableCustomers”中的每一行,查询都必须在“CustomerMapping”上进行表扫描。您需要在ErrorName字段上添加CustomerMapping索引,以便查询优化器避免表扫描并在不影响性能的情况下找到所需的数据。因此,创建一个索引(如果您的数据集非常大,则可能需要一些时间)。我不确定,但您也可以执行子查询,并按错误名称对数据进行排序,以帮助查询。。。但是最好的选择是索引。

问题是您正在比较字符串。很可能字符串列没有索引,因此对于表“TableCustomers”中的每一行,查询都必须在“CustomerMapping”上进行表扫描。您需要在ErrorName字段上添加CustomerMapping索引,以便查询优化器避免表扫描并在不影响性能的情况下找到所需的数据。因此,创建一个索引(如果您的数据集非常大,则可能需要一些时间)。我不确定,但您也可以执行子查询,并按错误名称对数据进行排序,以帮助查询。。。但最好的选择是索引。

如果从dbo.TableCustomers中选择i.CustomerJob、C.QBName,会发生什么情况?我留下了JOIN dbo.CustomerMapping C ON(i.CustomerJob=C.name)?您是否得到1000行或更多行?如果您只想更新客户名称等于错误名称的位置,为什么不在这两个名称相等的位置尝试内部联接,而不是使用左联接从客户表中获取所有内容。不确定这会提高性能多少,但值得一试。这两个表是通过ID关联的吗?Jason,我这样做了,我得到了1000行。它们不是通过ID关联的,当前唯一关联它们的方法是根据CustomerName列与另一个表中的错误名称列进行匹配。如果执行select I.CustomerJob,会发生什么,C.QBName FROM dbo.TableCustomers我离开加入dbo.CustomerMapping C ON(i.CustomerJob=C.name)?您是否得到1000行或更多行?如果您只想更新客户名称等于错误名称的位置,为什么不在这两个名称相等的位置尝试内部联接,而不是使用左联接从客户表中获取所有内容。不确定这会提高性能多少,但值得一试。这两个表是通过ID关联的吗?Jason,我这样做了,我得到了1000行。它们不是通过ID关联的,当前唯一关联它们的方法是根据CustomerName列与另一个表中的错误名称列进行匹配