我有下表(称为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表中不需要值和可见列。
答案 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