0

我有 2 张桌子

Customers

id,
CustomerName

桌子CustomerMapping

ID
WrongName,
CorrectedName

我想做的是:

如果 TableCustomers.CustomerName = TableCustomerMapping.WrongName,则使用 TableCustomerMapping.CorrectName 更新我的 TableCustomers.CustomerName

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

这是我正在尝试的更新语句,我错过了什么吗?

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

5 回答 5

2

如果这两个表由c.CustomerName = m.WrongName.

请注意there could be more than one person with same wrong name & correct name. 鉴于情况 ( not related by IDs) 我认为以下 ( INNER JOIN or JOIN) 将完成这项工作;

--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
于 2012-12-21T17:09:38.863 回答
2

不要LEFT JOIN... 如果您这样做,您将更新Customers表中的每条记录,并将所有不匹配的记录设置为NULL... 相反,请执行以下操作INNER JOIN

UPDATE c
SET c.CustomerName = cm.CorrectedName
FROM dbo.Customers c
INNER JOIN dbo.CustomerMapping cm ON (c.CustomerName = cm.WrongName);
于 2012-12-21T17:11:23.900 回答
2

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

于 2012-12-21T17:14:55.780 回答
0

也许您可以向 TableCustomerMapping 添加一个外键

**TableCustomerMapping**
___________________
ID,
fkCustomerID,
WrongName,
CorrectedName

然后使用它将 2 个表连接在一起,您将只更新 1 条记录

UPDATE i
SET i.CustomerJob = c.QBName
FROM dbo.TableCustomers i
LEFT JOIN dbo.CustomerMapping c ON (i.ID= c.fkCustomerID);
GO
于 2012-12-21T17:00:19.273 回答
0

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

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

我希望你工作

于 2012-12-21T17:08:00.377 回答