根据其他表

时间:2017-08-29 11:39:53

标签: sql-server sql-update

我有下表(表OptionTest),其中声明了功能和选项(可见的零表示功能选项不可见,一个表示选项可见。对于值,零表示选项未被选中,一个选项意味着选择了一个选项):

Feature_ID | OptionValue | value | visible
---------- | ----------- | ----- | -------
300        | 1           | 1     | 1
310        | 2           | 1     | 1

我想使用下表(表OptionVisibility)来确定上表(表OptionTest)中哪些选项不可见(即visible = 0)。即OptionTest表中的Feature_ID 310中的OptionValue 2中可见的值应根据OptionVisibility表的内容更新为0​​,因为Feature_ID_1 300中OptionValue_1 1的值为1,而Feature_ID_2中的OptionValue_2中的值为0。

Feature_ID_1 | OptionValue_1 |value| Feature_ID_2 | OptionValue_2| visible |
------------ | ------------- |-----| ------------ | -------------| ------- |
300          | 1             | 1   | 310          | 2            |0        |

我最终提出了以下问题。但是,由于查询返回0行受到影响,我仍然遗漏了一些东西。有什么想法吗?

UPDATE       
    OptionTest
    SET 
    OptionTest.Visible = OV2.visible
    FROM 
    OptionTest
    INNER JOIN OptionVisibility AS OV1 ON OptionTest.FeatureID = OV1.Feature_ID_1
    INNER JOIN OptionVisibility AS OV2 ON OptionTest.FeatureID = OV2.Feature_ID_2
    WHERE
    OptionTest.FeatureID=OV2.Feature_ID_2 AND OptionTest.OptionValue = OV2.OptionValue_2

更新

找到解决方案。我不得不使用左连接:

UPDATE       
    OptionTest
    SET 
    OptionTest.Visible = OV2.visible
    FROM 
    OptionTest
    LEFT JOIN OptionVisibility AS OV1 ON OptionTest.FeatureID = OV1.Feature_ID_1
    LEFT JOIN OptionVisibility AS OV2 ON OptionTest.FeatureID = OV2.Feature_ID_2
    WHERE
    OptionTest.FeatureID=OV2.Feature_ID_2 AND OptionTest.OptionValue = OV2.OptionValue_2

更新

认为解决方案有效,但当然查询当前状态不会检查值设置为1的位置(在这种情况下,查询应检查来自Feature_ID 300的optionvalue 1的值是否设置为1)。

更新

终于解决了这个难题

UPDATE       
OptionTest
SET OptionTest.Visible = Case When (select OptionTest.value from 
                                        OptionTest 
INNER JOIN OptionVisibility 
                                        ON OptionTest.FeatureID = OptionVisibility .Feature_ID_1  
                                        where OptionTest.ConfigurationID=66071 
                                        AND OptionTest.FeatureID = OptionVisibility.Feature_ID_1 
                                        AND OptionTest.OptionValue=OptionVisibility.OptionValue_1 
                                        AND OptionTest.value=1)=1 Then 0 Else 1 End
FROM OptionTest
INNER JOIN OptionVisibility ON OptionTest.FeatureID = OptionVisibility.Feature_ID_2
WHERE
OptionTest.OptionValue = OptionVisibility.OptionValue_2
AND OptionTest.ConfigurationID = 66071

1 个答案:

答案 0 :(得分:0)

试试这些..

 UPDATE tableOne 
       SET tableOne.Feature_ID= tableTwo.Feature_ID_1,
tableOne.OptionValue= tableTwo.OptionValue_1 ,
tableOne.value= tableTwo.value_1 ,
tableOne.visible= tableTwo.visible  FROM tableOne INNER JOIN  tableTwo ON tableOne .Feature_ID = tableTwo.Feature_ID_1