2017-08-30 46 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

相關問題