仅当所有其他行都满足条件时才更新行值

时间:2019-02-25 13:48:37

标签: sql-server

这个看似简单的表存在一些问题。我正在尝试将NEW_LVL列行的值更改为1(如果所有TRAINING_LVL行的值都为1)或0(如果TRAINING_LVL行之一的值是2),在这种情况下为NEW_NR值10。

USER_NR TRAINING_NR TRAINING_LVL NEW_NR NEW_LVL
49867   8400              2        10      0
49867   8490              1        10      1
49867   8480              1        10      1

到目前为止,我一直在尝试使用CASE方法来更改它,但是似乎无法更改它,以便仅在所有行都满足条件时才修改NEW_LVL值。相反,如果满足条件,它将更改每个单独行的值。

UPDATE dbo.MTD
    SET NEW_LVL =
    CASE
        WHEN NEW_NR = 10 AND TRAINING_LVL = 1 THEN 1
        ELSE 0
    END

有什么更好的方法?我尝试使用HAVING子句,但未成功。

4 个答案:

答案 0 :(得分:0)

使用INSTEAD OF DELETE

WHERE

如果您使用UPDATE dbo.MTD SET NEW_LVL = 1 WHERE NEW_NR = 10 AND TRINING_LVL = 1 ,则可以拥有CASE,但是最好使用ELSE NEW_LVL

答案 1 :(得分:0)

结合@jarlh的注释,我们可以尝试编写一个查询,该查询将输出所需的内容:

SELECT
    USER_NR,
    TRAINING_NR,
    TRAINING_LVL,
    NEW_NR,
    CASE WHEN NOT EXISTS (SELECT 1 FROM dbo.MTD
                          WHERE TRAINING_LVL <> 1 AND NEW_NR = 10)
         THEN 1 ELSE 0 END AS NEW_LVL
FROM dbo.MTD;

请注意,如果您希望新级别仅反映特定用户或某些其他分区,则我们将必须将存在查询关联起来。假设您要按用户报告,可以采用以下方法:

SELECT
    USER_NR,
    TRAINING_NR,
    TRAINING_LVL,
    NEW_NR,
    CASE WHEN NOT EXISTS (SELECT 1 FROM dbo.MTD t2
                          WHERE t2.USER_NR = t1.USER_NR AND t2.TRAINING_LVL <> 1 AND
                                t2.NEW_NR = 10)
         THEN 1 ELSE 0 END AS NEW_LVL
FROM dbo.MTD t1;

答案 2 :(得分:0)

您可以使用以下查询-

如果记录中有TRAINING_LVL!= 1且NEW_NR = 10,则此查询将返回计数>0。如果计数> 0,则意味着您需要更新0否则为1

declare @count int
 select @count = count(1) from mtd where TRAINING_LVL != 1 and NEW_NR = 10
 print @count

此查询将根据需要更新表中的值。

update mtd
 set NEW_LVL = (case when @count> 0 then 0 else 1 end)
 where NEW_NR = 10

答案 3 :(得分:0)

尝试一下;

.star option {
    background-color: blue;
}
.star option:hover {
    background-color: grey;
}