Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何仅更新与另一个表中一行中的值相对应的一个值?_Sql_Sql Server_Sql Update - Fatal编程技术网

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

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

我有下表(称为期权限制):

我使用该表更新另一个名为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表中将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