4

私はSQL文に苦労しています。

複合主キーを持つテーブルで、一部を除くすべての行を更新したいと考えています。

これは私が今していることです:

UPDATE Products SET Active = 0

_

UPDATE Products SET Active = 1
WHERE (Id_A = 1 AND Id_B = 1 AND Id_C = 1) OR
      (Id_A = 1 AND Id_B = 2 AND Id_C = 1) OR
      (Id_A = 5 AND Id_B = 8 AND Id_C = 3) OR
       .
       .
       .
       etc

これは機能しますが、私は好きではありません。一発でできるようになりたいです。

SQLでこれを行う方法はありますか?

4

3 に答える 3

7

次のような意味です。

UPDATE Products SET Active = CASE WHEN
      (Id_A = 1 AND Id_B = 1 AND Id_C = 1) OR
      (Id_A = 1 AND Id_B = 2 AND Id_C = 1) OR
      (Id_A = 5 AND Id_B = 8 AND Id_C = 3) OR
       .
       .
       .
       THEN 1 ELSE 0 END
于 2012-08-30T13:18:16.897 に答える
2

一部のSQL製品では、内部の構文をさらに単純化して、複数をCASE削除し、単純なものにすることができます。ANDORIN

UPDATE Products 
SET Active = CASE WHEN
      (Id_A, Id_B, Id_C) IN
      ( (1, 1, 5), (1, 2, 1), (5, 8, 3) ... ) 
             THEN 1 ELSE 0 
             END ;

考慮すべきもう1つのことは、テーブルに多数の行(数百万または数十億など)があり、に設定されている割合が少ないActive=1場合は、2つのステートメントを使用する方が、おそらくより効率的です。最初に、にインデックス(Active)(またはに部分インデックス(Active=1))があると仮定します。

UPDATE Products SET Active = 0 WHERE Active = 1 ;

UPDATE Products SET Active = 1 WHERE ... ;
于 2012-08-30T13:26:23.463 に答える
1

update ステートメント内で case 式を使用できますか?

何かのようなもの

UPDATE Products
    set Active = CASE WHEN (Id_A = 1 AND Id_B = 1 AND Id_C = 1) THEN 1 
                      WHEN (Id_A = 1 AND Id_B = 2 AND Id_C = 1) THEN 1                         
                      .
                      .
                      . 
                      ELSE 0 END
于 2012-08-30T13:21:31.297 に答える