更新表与子查询中的表相同

时间:2012-02-22 10:46:39

标签: sql-server

UPDATE MyTable SET Status = (SELECT CASE WHEN COUNT(*) > 0
                            THEN 0          
                            ELSE 1
                            END 
                    FROM MyTable 
                    WHERE Status = 1 )
WHERE RowNumber BETWEEN 1 AND 5
ORDER BY RowNumber

我想要做的是MyTable中只有一行,Status = 1。 当我将RowNumber 1更新为5时,如果存在Status = 1的现有记录, 那些RowNumber 1到5将更新为0.否则,只有RowNumber 1将更新为0,RowNumber 2到5将设置为0。

但上述查询无效。我想在整个查询之前运行子查询,子查询的结果是静态的,这意味着在更新另一条记录后不会将新结果作为一条记录。

使用此查询,如果表中没有Status = 1的行,则所有RowNumber 1到5都会更新为Status = 1.这不是我所期望的。

1 个答案:

答案 0 :(得分:0)

不确定我是否完全理解了你之后的内容 - 但听起来你需要在原案例的else子句中添加嵌套的case语句。请参阅以下代码:

UPDATE MyTable SET Status = (SELECT CASE WHEN COUNT(*) > 0
                        THEN 0          
                        ELSE CASE WHEN RowNumber = 1 THEN 1
                             ELSE 0 END
                        END 
                FROM MyTable 
                WHERE Status = 1 )
WHERE RowNumber BETWEEN 1 AND 5
ORDER BY RowNumber