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