Sql 只更新一条满足条件记录

需求:将满足条件记录的"状态"字段置为“1”,但是要求表中只有一条记录"状态"为“1”;


开始的SQL:
UPDATE [T_STOCK_STATE]
SET [STATE] = '1'
WHERE [UPDATE_TIME] = (SELECT MIN([UPDATE_TIME]) FROM [T_STOCK_STATE])


原以为这个 [UPDATE_TIME]不会相同,结果操作中却发现[UPDATE_TIME]字段有相同的;

为了保持唯一一个状态为“1”的记录,最先想到的是TOP;
查询的时候经常用 Select Top 1 字段1,字段2,...

改进的SQL:

于是打算在WHERE条件哪里用Select Top 1查出一条记录的主键来(或者其他能唯一标识一条记录的多个字段)

UPDATE [T_STOCK_STATE]
SET
[STOCK_STATE] = '1'
WHERE STOCK_CODE =(SELECT TOP 1 STOCK_CODE FROM [T_STOCK_STATE] WHERE [UPDATE_TIME] =(SELECT MIN([UPDATE_TIME]) FROM [T_STOCK_STATE]))

总感觉这个SQL有点不美,查了一些资料。
喻威淇在下面文章里的留言给了更好的答案
http://www.cnblogs.com/wangshijie/archive/2009/05/05/1450161.html#2690990
1楼

其实我们在UPDATE 后面就可以直接用Top
但是要用Top(1),要带括号的,否则会报错;

最终的SQL:
UPDATE TOP(1) [T_STOCK_STATE]
SET
[STATE] = '1'
WHERE [UPDATE_TIME] = (SELECT MIN([UPDATE_TIME]) FROM [T_STOCK_STATE])


是不是简洁了许多,感谢“喻威淇”;

 

posted @ 2013-05-28 13:51  RocLee  阅读(2045)  评论(0编辑  收藏  举报