【问题标题】:Update SQL Server two statements更新 SQL Server 两条语句
【发布时间】:2016-12-21 15:55:34
【问题描述】:
UPDATE ADDRESS 
SET ADDRESS.LATITUDE = b.latitude,
    ADDRESS.LONGITUDE= b.LONGITUDE
FROM POSTAL_CODE_LOOKUP b
WHERE ADDRESS.postal_cd = b.POSTALCODE
  AND (address.LATITUDE != b.LATITUDE OR address.LONGITUDE !=b.LONGITUDE)

 11:20:23  [BEGIN - 2454 row(s), 0.437 secs]  Command processed
 11:20:23  [BEGIN - 2454 row(s), 0.437 secs]  Command processed
... 2 statement(s) executed, 4908 row(s) affected, exec/fetch time: 0.874/0.000 sec  [2 successful, 0 warnings, 0 errors]

执行更新后,我运行下面的 SQL 并获得 2454 条记录。

select 
    a1.POSTAL_CD, b.POSTALCODE, 
    a1.LATITUDE, b.LATITUDE, 
    a1.LONGITUDE, b.LONGITUDE
from
    ADDRESS a1, POSTAL_CODE_LOOKUP b
where 
    a1.postal_cd = b.postalcode
    and (a1.LATITUDE != b.LATITUDE or a1.LONGITUDE != b.LONGITUDE);

是的,我已经提交了,而且记录没有改变。我不明白为什么将更新解读为 2 条语句。我不明白为什么它不更新。

我应该如何写这个更新声明?

【问题讨论】:

  • 也许Address 有一个UPDATE 触发器。
  • 你不应该再使用旧式连接了:old-style joins
  • 奇怪的问题,但你确定你已经正确标记了这个问题吗?这些输出消息与我熟悉的sql-server 不同。

标签: sql sql-server sql-server-2008 sql-update


【解决方案1】:

使用以下脚本更新地址表。

UPDATE a 
SET    a.LATITUDE = b.latitude,
       a.LONGITUDE= b.LONGITUDE
FROM [ADDRESS] a
 JOIN POSTAL_CODE_LOOKUP b
        ON a.postal_cd = b.POSTALCODE
WHERE (a.LATITUDE != b.LATITUDE or a.LONGITUDE !=b.LONGITUDE)

【讨论】:

    【解决方案2】:

    我认为您的联接中有多个行对应一个邮政编码

    【讨论】:

      【解决方案3】:

      您的 ADDRESS 表必须有更新触发器,这就是为什么有第二条关于 2454 行的语句。

      更新的数量仅为 2454 行,与您之后选择的数字相同。

      【讨论】:

        猜你喜欢
        • 2018-07-19
        • 2018-03-11
        • 2013-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多