2017-08-30 24 views
0

我有如下表(称为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 

然而,与此查询的问题是,当我比如想从功能775更新OptionValue 3可见= 0(设定值的基础上,从功能397的OptionValue 2到1),查询更新从功能775的OptionValue 3和4中的可见更新为0,而我希望它只能从OptionValue 3从功能775更新为可见。我怎样才能实现这个?

UPDATE

configvalue的初始状态(当从功能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的选项值2的值设置为1时:

ConfigurationID Feature ID OptionValue Visible Value 
66311    397   2    1   1 

发生这种情况(可见从功能775两optionvalues更新为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 optionvalue 3应更新回1。这就是为什么我使用的情况,我的现在查询。所以实际上,OptionRestriction表中不需要value和visible列。

+0

如果只有'OptionValue2 = 3'应使用,只需添加这谓词WHERE – Serg

+0

呀,但查询应该从表格中识别出正确的值。因此,例如,查询应该能够识别如果来自特征397的选项值2的值设置为1,则来自特征775的来自选项值3的可见值应该被设置为0. – user2237168

+0

请显示ConfigValue初始状态和期望的更新结果 – Serg

回答

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 
+0

感谢您的更新查询。它部分起作用。正如在我的主要问题的结尾所述,查询也应该更新可见性回到1,当另一个optionvalue的相关值是0时。这仍然不起作用。 – user2237168

+0

更新的答案中的SELECT返回了什么,它有什么问题? – Serg

+0

select语句仅返回标题(ConfigurationID,FeatureID等)。但是,更新查询运行良好,但如果相关选项值的值为0,则不会更新可见性。例如,当来自特征ID 397的选项值2的值被设置回0时,可从特征775选项值3应该更新回1 – user2237168

相关问题