Sql 如何仅更新与另一个表中一行中的值相对应的一个值?
我有下表(称为期权限制): 我使用该表更新另一个名为ConfigValue的表中的值。现在,我有以下查询来执行此操作:Sql 如何仅更新与另一个表中一行中的值相对应的一个值?,sql,sql-server,sql-update,Sql,Sql Server,Sql Update,我有下表(称为期权限制): 我使用该表更新另一个名为ConfigValue的表中的值。现在,我有以下查询来执行此操作: UPDATE ConfigValue SET ConfigValue.Visible = Case When (select ConfigValue.value from ConfigValue INNER JOIN OptionRestriction
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表中将OptionValue 3从功能775更新为visible=0(基于将功能397 OptionValue 2的值设置为1)时,该查询将从功能775的OptionValue 3和4更新为visible=0,而我希望它只从OptionValue 3将visible从功能775更新为0。我怎样才能做到这一点
更新
configvalue的初始状态(当OptionValue from Feature 397的值为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):
虽然我希望发生这种情况(仅更新从optionvalue 3可见的功能775到0。就像在OptionRestriction的第一行中一样):
当来自功能id 397的optionvalue 2的值设置为0时,从功能775可见的optionvalue 3应更新回1。这就是我现在在查询中使用CASE的原因。因此,实际上,OptionRestriction表中不需要value和visible列。看起来您需要
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
如果只应使用
OptionValue2=3
,只需将此谓词添加到whereyes,但查询应识别表中正确的值。因此,例如,如果功能397的OptionValue 2的值设置为1,查询应该能够识别visible from OptionValue 3 from feature 775应该设置为0。请显示ConfigValue初始状态和所需的更新结果我已经编辑了我的初始问题。在“更新”下,您可以看到初始结果和所需结果如果您希望根据另一个表中的两列(或列集)之一有条件地对表执行更新,我认为您需要重新构造源表以删除(基本上)重复的列,并将其移动为行,或者使用动态SQL来构造查询,使其从正确的列(或列集)开始工作。感谢VOR或更新查询。它部分起作用。正如我在主要问题末尾所述,当另一个optionvalue的相关值为0时,查询也应更新为1。这仍然不起作用。更新答案中的SELECT返回了什么,有什么问题?SELECT语句只返回标题(ConfigurationID、FeatureID等)。但是,更新查询运行正常,但如果相关optionvalue的值为0,则不会将visible更新回1。例如,当功能id 397中的optionvalue 2的值设置回0时,功能775中的visible optionvalue 3应更新回1很难说对整件事了解得这么少,但我猜OptionRestriction
忽略了0的规则。要在cvFrom
中找到该行,它应该是一个值
=0的行。非常感谢您!你是对的。需要添加value=0的行。
ConfigurationID Feature ID OptionValue Visible Value
66311 775 3 0 0
66311 775 4 0 0
ConfigurationID Feature ID OptionValue Visible Value
66311 775 3 0 0
66311 775 4 1 0
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