SQL Update仅更新一行

时间:2017-05-23 18:27:12

标签: sql sql-server triggers arcgis

这段代码只更新一行,为什么?它与其中一个子查询有关,但我不确定。我在UPDATE语句中思考WHERE..IN,但我不确定。

UPDATE [sde].[sy1].[Valve_evw]
SET [sde].[sy1].[Valve_evw].[MA] 
             = (SELECT [sde].[sy1].[Valve_Join_evw].[MC] 
                FROM [sde].[sy1].[Valve_Join_evw])
WHERE [sde].[sy1].[Valve_evw].[PrimaryKey]  
            IN (SELECT [sde].[sy1].[Valve_Join_evw].[PrimaryKey] 
                FROM [sde].[sy1].[Valve_Join_evw]
                WHERE  [sde].[sy1].[Valve_Join_evw].[MA]
                != [sde].[sy1].[Valve_Join_evw].[MC])

上下文:

我要做的是使用Valve_Join_evw中的MC列更新Valve_evw中的MA列。 Valve_evw中的PrimaryKey引用等效行作为Valve_Join_evw中的PrimaryKey。如同,Valve_Join_evw中的单行将具有与Valve_evw中的单个行相同的PrimaryKey,因此该等效可用于更新Valve_evw中的记录。 MA列在两个表中都是等效的。 [注意:Valve_Join_evw表是使用ESRI映射软件使用Valve_evw和单独表之间的空间关系创建的,这就是重复行的存在方式]

我在SQL Server中使用数据库视图(因此' _evw')并使用默认的INSTEAD OF UPDATE触发器。此组合,视图和触发器可防止使用表连接执行此更新。我也试过MERGE,但这也行不通。因此我坚持ANSI标准,因此子查询。此脚本运行时没有错误,但它只更新一行,而表中大约有9000,000行。

输出消息:

(1 row(s) affected)

(0 row(s) affected)

3 个答案:

答案 0 :(得分:2)

首先,让我们减少眼睛伤害SQL的真实情况:

update sde.sy1.valve_evw
set ma = (select mc from sde.sy1.valve_join_evw)
where primarykey in (select primarykey from sde.sy1.valve_join_evw where ma <> mc)

WHERE子句

我们会在primarykey中查找记录为valve_join_evw的所有ma <> mc。我们使用valve_evw更新所有primarykey条记录。

SET子句

对于我们想要更新的记录,我们将ma设置为找到的值:

select mc from sde.sy1.valve_join_evw

但是这个查询没有where子句,那么它选择什么值来填充记录的ma字段?它从mc中选择 all valve_join_evw,因此DBMS可能会随意选择其中一个值。 (这会更好,它会引起错误。)

<强>结论

很容易看出该语句将更新哪些记录。

哪个primarykey

select primarykey from sde.sy1.valve_join_evw where ma <> mc

哪些行:

select * 
from sde.sy1.valve_evw
where primarykey in (select primarykey from sde.sy1.valve_join_evw where ma <> mc)

关于SET子句:在子查询中添加WHERE子句,该子句将要选择的记录与要更新的记录相关联(同一ma?同一primarykey? )例如:

set ma = 
(
  select mc 
  from sde.sy1.valve_join_evw vj
  where vj.primarykey = valve_evw.primarykey
    and vj.ma         = valve_evw.ma
)

答案 1 :(得分:0)

您好我首先建议您执行select语句,当您确定检索到te记录时,请使用相同的更新语句

答案 2 :(得分:0)

这是最终脚本的样子。

UPDATE [Valve_evw]
SET [Valve_evw].[MA] =
              (
                SELECT [Valve_Join_evw].[MC] 
                FROM [Valve_Join_evw]
                WHERE[Valve_Join_evw].[PrimaryKey] = [Valve_evw].[PrimaryKey]
               )
WHERE [Valve_evw].[PrimaryKey]  
            IN (
                 SELECT [Valve_Join_evw].[PrimaryKey] 
                 FROM [Valve_Join_evw]
                 WHERE  [Valve_Join_evw].[MA]
                 != [Valve_Join_evw].[MC]
                );