SQL更新只更新一行

SQL Update only updates one row

这段代码只更新了一行,为什么?它与其中一个子查询有关,但我不确定。我在想 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 中的主键引用与 Valve_Join_evw 中的主键等效的行。如同,Valve_Join_evw 中的单行将与 Valve_evw 中的单行具有相同的主键,因此可以使用该等效性来更新 Valve_evw 中的记录。 MA 列在两个 table 中也是等效的。 [注意:Valve_Join_evw table 是使用 ESRI 制图软件使用 Valve_evw 和单独的 table 之间的空间关系创建的,这就是重复行的存在方式]

我在 SQL 服务器中使用数据库视图(因此是 '_evw'),带有默认的 INSTEAD OF UPDATE 触发器。这种视图和触发器的组合阻止使用 table 连接来执行此更新。我也尝试过 MERGE 但这也不起作用。因此我坚持使用 ANSI 标准,因此使用子查询。该脚本运行没有错误,但它只更新了一行,而 table 中有大约 900 万行。

输出信息:

(1 row(s) affected)

(0 row(s) affected)

您好,我建议您先执行 select 语句,当您对检索到的记录没问题时,请使用相同的 where 更新语句

首先让我们将眼睛伤害 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 子句

我们在 valve_join_evw 中查找记录 ma <> mc 中的所有 primarykey。我们用 primarykey.

更新所有 valve_evw 记录

SET 子句

对于我们要更新的记录,我们将 ma 设置为通过以下方式找到的值:

select mc from sde.sy1.valve_join_evw

但是这个查询没有 where 子句,那么 select 填充记录的 ma 字段的值是多少?它 selects all mc 来自 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 子句添加到您的子查询,将记录与 select 关联到要更新的记录(相同 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
)

这是最终脚本的样子。

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]
                );