【问题标题】:SQL Update (simple??)SQL 更新(简单??)
【发布时间】:2012-12-21 16:55:47
【问题描述】:

我有两张桌子

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

【问题讨论】:

  • 如果您选择 i.CustomerJob, C.QBName FROM dbo.TableCustomers 我离开 JOIN dbo.CustomerMapping c ON (i.CustomerJob = c.MOAName) 会发生什么?你有 1000 行,还是更多?
  • 如果您只想更新客户名称等于错误名称的位置,为什么不尝试在这两个相同的位置进行内部联接,而不是使用左联接从客户表中获取所有内容。不确定它会在多大程度上提高性能,但值得一试
  • 这两个表是否通过 ID 关联?
  • 杰森,我做到了,我得到了 1000 行。
  • 它们与 id 无关,当前关联它们的唯一方法是根据 CustomerName 列与另一个表中的 WrongName 列进行匹配

标签: sql sql-server tsql sql-update


【解决方案1】:

如果这两个表由 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

【讨论】:

    【解决方案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);
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        也许你可以给 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
        

        【讨论】:

          【解决方案5】:

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

          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
          

          我希望你工作

          【讨论】:

            猜你喜欢
            • 2015-12-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-26
            • 2019-07-27
            相关资源
            最近更新 更多