3

以下代码旨在仅在存在与该字段相关的值时更新特定字段。

它返回一组不完整的值。数百万行是正确的,但数千行的值被错误地设置为 NULL。

这是 SQL 限制,还是我遗漏了什么?

UPDATE a
    SET ResultType1 = CASE WHEN b.[Type] = 'type1' THEN b.value END
       ,ResultType2 = CASE WHEN b.[Type] = 'type2' THEN b.value END
    FROM tableA AS a
    INNER JOIN tableB AS b ON a.ID = b.ID
4

1 回答 1

7

仅当存在与该字段相关的值时才更新特定字段

让我觉得你真的想要这样做:

UPDATE a
  SET ResultType1 = CASE WHEN b.[Type] = 'type1' 
                           THEN b.value 
                         ELSE ResultType1 
                    END
    , ResultType2 = CASE WHEN b.[Type] = 'type2' 
                           THEN b.value 
                         ELSE ResultType2 
                    END
FROM tableA AS a
    INNER JOIN tableB AS b ON a.ID = b.ID

因此,如果不满足 b.Type 条件,ResultType1/2 将设置为它们的现有值,而不是设置为 NULL。

我假设当你说“不完整的值集”时,你的意思是有些被设置为 NULL。

导致这种行为的原因是表达式中的ELSE NULL隐含CASE


如果你真的想用空值更新ResultType1ResultType2,但只对那些不同的行'type',一个稍微不同的查询会做:

UPDATE a
  SET ResultType1 = CASE WHEN b.[Type] = 'type1' 
                           THEN b.value 
                         ELSE NULL                 --- this line can be removed
                    END
    , ResultType2 = CASE WHEN b.[Type] = 'type2' 
                           THEN b.value 
                         ELSE NULL                 --- this one, too
                    END
FROM tableA AS a
    INNER JOIN tableB AS b ON a.ID = b.ID
WHERE b.[Type] IN ('type1', 'type2')
于 2012-05-04T07:31:39.363 回答