需求:将满足条件记录的"状态"字段置为“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])
是不是简洁了许多,感谢“喻威淇”;