更新查询以通过循环运行以更新许多行

时间:2013-10-23 09:04:06

标签: sql-server-2008 sql-update

我很少在与SQL交易中使用update语句,并且在这样做时会有点紧张。在之前的一期中,我提出了它,我决定在一些表中添加一个标识列作为代理键。考虑到170万行,我希望尽可能顺利地完成这项工作。所以我需要做的是运行一个循环更新并使用相关数据更新每个字段。

表1:tblPostCodeLookup

Postcode | Postcode ID
AB44     | 1
AB45     | 2

表2:tblPostcodeStreetView

ID | Postcode | Postcode ID
1  | AB446TR  | 1
2  | AB447TY  | 1
3  | AB457HH  | 2

我已经做了基本的更新

UPDATE    tblPostcodesStreetsView
SET              PostcodeID = 1
WHERE     (postcode LIKE 'AB44%')

然而,让这个经历并更新每一个导致我的问题!

2 个答案:

答案 0 :(得分:6)

UPDATE  psv
SET              PostcodeID = pcl.PostcodeID
FROM    tblPostcodesStreetsView psv
         INNER JOIN
        tblPostCodeLookup pcl
          on
            pcv.postcode LIKE pcl.postcode + '%'

应该做的伎俩。除非tblPostCodeLookup中有多个行与tblPostcodesStreetsView中的同一行匹配 - 在这种情况下,PostCodeID分配的行没有明确定义。

UPDATE...FROM是SQL Server方言,它不是标准SQL。标准方法类似于:

UPDATE  tblPostcodesStreetsView
SET     PostcodeID = (select pcl.PostcodeID from tblPostCodeLookup pcl
                 where tblPostcodesStreetsView.postcode LIKE pcl.postcode + '%')

对于我提到的多场比赛的上述场景,至少会产生错误。

答案 1 :(得分:1)

完整性检查结果如何:

SELECT tblPostcodeStreetView.Postcode
     , tblPostCodeLookup.Postcode
     , tblPostCodeLookup.Postcode_ID
FROM   tblPostcodeStreetView
 INNER
  JOIN tblPostCodeLookup
    ON tblPostcodeStreetView.Postcode LIKE tblPostCodeLookup.Postcode + '%'

将此作为更新声明

UPDATE tblPostcodeStreetView
SET    Postcode_ID = tblPostCodeLookup.Postcode_ID
FROM   tblPostcodeStreetView
 INNER
  JOIN tblPostCodeLookup
    ON tblPostcodeStreetView.Postcode LIKE tblPostCodeLookup.Postcode + '%'