这段代码只更新一行,为什么?它与其中一个子查询有关,但我不确定。我在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)
答案 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]
);