1

我在处理 SQL 时很少使用更新语句,这样做时会有点紧张。在我提出的上一个问题中,我决定需要将标识列添加到一些表中以用作代理键。鉴于有 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%')

然而,让这个运行并更新每一个都会导致我的问题!

4

2 回答 2

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 + '%')

对于我提到的上述多个匹配的场景,这至少会产生错误。

于 2013-10-23T09:13:07.547 回答
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 + '%'
于 2013-10-23T09:14:54.443 回答