0

我需要更改是/否列,其中日列具有最高值和第二高值。

ID 菜单(INT NOT NULL PRIMARY KEY);天(INT NULL);是/否(BIT NUL)
100 ; 1; 1101
; 2; 0
102 ; 3;1103
; 4;0
104 ; 5; 0

我应该得到的结果是
Id menu(INT NOT NULL PRIMARY KEY) ; 天(INT NULL);是/否(BIT NUL)
100 ; 1; 1101
; 2; 0
102 ; 3;1103
; 4;1104
; 5; 1

我可以使用 UPDATE Menu SET YES/NO = 1 WHERE DAY = 4 更改行

但由于日子将继续上升,这意味着我必须在撰写声明之前知道哪一天是最高的一天。如何更新查找具有最高值和第二高值的日期的语句我试过 UPDATE Menu SET YES/NO = 1 WHERE MAX(day)

4

1 回答 1

0

测试驱动的查询设计 (TDQD) 再次提供帮助。

查找最大天值

SELECT MAX(day) FROM Menu

查找第二个最大日值

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

第二个最大日是不是最大日值的最大日值。

选择不包含第二个最大值或最大值的行

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

这些是需要将是/否位设置为零的行。

选择包含第二个最大值或最大值天值的行

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

这些是需要将是/否位设置为 1 的行。

更新两组行

显然,您可以SELECT *UPDATE Menu SET Yes_No = 0(或1)替换两组数据。如果您的 DBMS 允许您从要更新的表中进行选择(并非所有 DBMS 都这样做),您可能可以将两者组合成一个操作:

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 回答