如何仅更新与另一个表中一行的值对应的一个值?

时间:2017-08-30 07:26:29

标签: sql sql-server sql-update

我有下表(称为OptionRestriction):

 Feature_ID_1   OptionValue_1   value   Feature_ID_2    OptionValue_2   visible
      397             2           1         775              3            0
      404             3           1         403              5            0
      397             3           1         775              4            0

我使用该表更新另一个名为ConfigValue的表中的值。现在我有以下查询来执行此操作:

UPDATE       
ConfigValue
SET ConfigValue.Visible = Case When (select ConfigValue.value from 
                                        ConfigValue INNER JOIN OptionRestriction 
                                        ON ConfigValue.FeatureID = OptionRestriction.Feature_ID_1  
                                        where ConfigValue.ConfigurationID=66311 
                                        AND ConfigValue.FeatureID = OptionRestriction.Feature_ID_1 
                                        AND ConfigValue.OptionValue=OptionRestriction.OptionValue_1 
                                        AND ConfigValue.value=OptionRestriction.value)=1 Then 0 Else 1 End
FROM ConfigValue
INNER JOIN OptionRestriction ON ConfigValue.FeatureID = OptionRestriction.Feature_ID_2
WHERE
ConfigValue.OptionValue = OptionRestriction.OptionValue_2
AND ConfigValue.ConfigurationID = 66311

但是,此查询的问题是,当我例如想要在ConfigValue表中将功能775中的OptionValue 3更新为visible = 0(基于功能397 OptionValue 2中的设置值为1)时,查询OptionValue 3和4中来自功能775的更新可见0,而我希望它仅从功能775中的OptionValue 3更新为0。我怎样才能实现此目的?

更新

configvalue的初始状态(当Feature 397中OptionValue的值为0时)为:

ConfigurationID   Feature ID   OptionValue   Visible   Value
66311             397          2             1         0

对于featureID 775选项值3和4:

ConfigurationID   Feature ID   OptionValue   Visible   Value
66311             775          3             1         0
66311             775          4             1         0

目前,来自功能ID 397的optionvalue 2的值设置为1:

ConfigurationID   Feature ID   OptionValue   Visible   Value
66311             397          2             1         1

这种情况发生(从功能775的两个选项值都可以看到更新为0):

ConfigurationID   Feature ID   OptionValue   Visible   Value
66311             775          3             0         0
66311             775          4             0         0

虽然我希望这种情况发生(仅从optionvalue 3从功能775更新为0,就像在OptionRestriction的第一行中一样):

ConfigurationID   Feature ID   OptionValue   Visible   Value
66311             775          3             0         0
66311             775          4             1         0

当来自功能ID 397的optionvalue 2的值设置为0时,从功能775选项值3可见的值应该更新回1.这就是我现在在查询中使用CASE的原因。实际上,OptionRestriction表中不需要值和可见列。

1 个答案:

答案 0 :(得分:1)

看起来你需要

UPDATE cvUpd
SET cvUpd.visible = case cvFrom.value when 1 then 0 else 1 end 
FROM ConfigValue cvUpd
INNER JOIN OptionRestriction r ON cvUpd.ConfigurationID=66311
   AND cvUpd.FeatureID = r.Feature_ID_2
   AND cvUpd.OptionValue= r.OptionValue_2
INNER JOIN ConfigValue cvFrom ON cvFrom.FeatureID =r.Feature_ID_1  
   AND cvFrom.ConfigurationID = cvUpd.ConfigurationID 
   AND cvFrom.OptionValue=r.OptionValue_1 
   AND cvFrom.value=r.value

要检查查询是否加入正确的行,只需运行

SELECT cvUpd.*, r.*, cvFrom.* , newval = case cvFrom.value when 1 then 0 else 1 end 
FROM ConfigValue cvUpd
INNER JOIN OptionRestriction r ON cvUpd.ConfigurationID=66311
   AND cvUpd.FeatureID = r.Feature_ID_2
   AND cvUpd.OptionValue= r.OptionValue_2
INNER JOIN ConfigValue cvFrom ON cvFrom.FeatureID =r.Feature_ID_1  
   AND cvFrom.ConfigurationID = cvUpd.ConfigurationID 
   AND cvFrom.OptionValue=r.OptionValue_1 
   AND cvFrom.value=r.value