【问题标题】:Update statement updates all records in the table and not the ones related to the condition更新语句更新表中的所有记录,而不是与条件相关的记录
【发布时间】:2019-12-30 19:41:34
【问题描述】:

我有一个名为 STG_Params 的下表:

Schema Table           DataBase Flag_Full
dbo    Users           LocalDB  1
dbo    bankInformation LocalDB  0
dbo    Language        LocalDB  0
dbo    Employee        LocalDB  1
dbo    WorkPermit      LocalDB  1
dbo    Roles           LocalDB  1
dbo    School          LocalDB  1
dbo    Nationality     LocalDB  1
dbo    Degree          LocalDB  1

我想更新具有如下表名的记录并将其 Flag_Full 设置为 0:

UPDATE STG_Param SET Flag_Full = 0 
WHERE EXISTS (SELECT m.* from STG_Param m where m.[Table] in ('Users','Employee','Roles',WorkPermit')

当我执行查询时,它会更新 Flag_Full=1 的所有记录,包括 where 条件中未提及的表名。

【问题讨论】:

  • 您的WHERE 子句总是评估为true,因为您只是在检查四个表名中的至少一个是否存在。情况总是如此,因此每一行都是要更新的数据的一部分。

标签: sql-server tsql


【解决方案1】:

您可以为要更新的表指定别名并直接使用 where 条件。如果需要根据另一个表中的条件获取表列表,也可以在 WHERE 子句之前使用连接。

UPDATE STG 
SET STG.Flag_Full = 0 
FROM STG_Param STG
WHERE STG.[Table] IN ('Users','Employee','Roles','WorkPermit')

【讨论】:

    【解决方案2】:

    您在此处有 2 个查询构成您的完整陈述。第一个是UPDATE STG_Param SET Flag_Full = 0,如果以下子查询(相关)至少返回一行,这将更新一行:SELECT m.* from STG_Param m where m.[Table] in ('Users','Employee','Roles',WorkPermit')

    这意味着如果STG_Param 表中的至少一行具有'Users','Employee','Roles''WorkPermit'Table 的值,则全部STG_Param 中的行将被更新,因为EXISTS 将返回TRUE

    你需要的只是一个简单的WHERE:

    UPDATE STG_Param 
    SET Flag_Full = 0 
    WHERE [Table] IN ('Users','Employee','Roles',WorkPermit');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-16
      • 2023-01-12
      • 2022-01-06
      • 1970-01-01
      • 2013-03-08
      • 2014-12-16
      • 2012-07-25
      • 2021-03-30
      相关资源
      最近更新 更多