Sql server Update语句更新表中的所有记录,而不是与条件相关的记录
我有一个名为STG_Params的下表:Sql server Update语句更新表中的所有记录,而不是与条件相关的记录,sql-server,tsql,Sql Server,Tsql,我有一个名为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
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
我想更新具有如下表名的记录,并将其标志_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')
当我执行查询时,它会用标志_Full=1更新所有记录,包括where条件中未提及的表名。您可以为正在更新的表提供别名,并直接使用where条件。如果需要根据另一个表中的条件获取表列表,还可以在WHERE子句之前使用联接
UPDATE STG
SET STG.Flag_Full = 0
FROM STG_Param STG
WHERE STG.[Table] IN ('Users','Employee','Roles','WorkPermit')
这里有两个问题构成了您的完整陈述。第一个是
UPDATE STG\u Param SET Flag\u Full=0
,这将更新一行,前提是以下子查询(不相关)至少返回一行:SELECT m.*from STG\u Param m,其中m.[表]位于('Users'、'Employee'、'Roles',WorkPermit')
这意味着,如果表STG_-Param
中至少有一行的值为'Users'
,'Employee'
,'Roles'
或'WorkPermit'
,则表STG_-Param
中的所有行都将更新,当存在时
将返回TRUE
这里您需要的只是一个简单的,其中
:
UPDATE STG_Param
SET Flag_Full = 0
WHERE [Table] IN ('Users','Employee','Roles',WorkPermit');
您的
WHERE
子句总是计算为true
,因为您只是检查四个表名中是否至少有一个存在。情况总是如此,因此每一行都是要更新的数据的一部分。