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 は既存の値に設定されます。INSTEAD は NULL に設定されます。

「不完全な値のセット」と言うときは、一部が NULL に設定されていることを意味していると思います。

この動作の原因はELSE NULLCASE式に含まれていることです。


ResultType1実際に と null を更新したいResultType2が、異なる の行のみを対象とする場合'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 に答える