0

日の列に最高値と 2 番目に高い値がある [はい/いいえ] 列を変更する必要があります。

Id menu(INT NOT NULL PRIMARY KEY) ; 日 (INT NULL) ; はい/いいえ (ビット NUL)
100 ; 1 ; 1
101 ; 2 ; 0
102 ; 3 ; 1
103 ; 4 ; 0
104 ; 5 ; 0

取得する必要がある結果は
Id menu(INT NOT NULL PRIMARY KEY) です。日 (INT NULL) ; はい/いいえ (ビット NUL)
100 ; 1 ; 1
101 ; 2 ; 0
102 ; 3 ; 1
103 ; 4 ; 1
104 ; 5 ; 1

UPDATE Menu SET YES/NO = 1 WHERE DAY = 4 で行を変更できます

しかし、日は上がり続けるので、ステートメントを書く前に、どの日が最も高いかを知る必要があります. 最高値と 2 番目に高い値を持つ日を見つけるステートメントを更新するにはどうすればよいですか。 UPDATE メニュー SET YES/NO = 1 WHERE MAX(day)

4

1 に答える 1

0

Test Driven Query Design (TDQD) が再び役に立ちます。

日の最大値を見つける

SELECT MAX(day) FROM Menu

2 番目の最大日の値を見つける

SELECT MAX(day)
  FROM Menu
 WHERE day != (SELECT MAX(day) FROM Menu)

2 番目の最大日は、最大日の値ではない最大の日の値です。

2 番目の最大値または最大日の値を含まない行を選択します

SELECT *
  FROM Menu
 WHERE Day < (SELECT MAX(day)
                FROM Menu
               WHERE day != (SELECT MAX(day) FROM Menu)
             )

これらは、Yes/No ビットをゼロに設定する必要がある行です。

2 番目の最大値または最大日の値を含む行を選択します

SELECT *
  FROM Menu
 WHERE Day >= (SELECT MAX(day)
                 FROM Menu
                WHERE day != (SELECT MAX(day) FROM Menu)
              )

これらは、Yes/No ビットを 1 に設定する必要がある行です。

2 セットの行を更新する

明らかに、2 つのデータ セットのSELECT *UPDATE Menu SET Yes_No = 0(または1) に置き換えることができます。DBMS で更新するテーブルから選択できる場合 (すべての DBMS がそうしているわけではありません)、おそらく 2 つを 1 つの操作に組み合わせることができます。

UPDATE Menu
   SET Yes_No = (CASE WHEN day < (SELECT MAX(day) FROM Menu
                                   WHERE day != (SELECT MAX(day) FROM Menu))
                      THEN 0
                      ELSE 1 END)
于 2012-07-01T22:55:06.797 に答える