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])


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

 

转载于:https://www.cnblogs.com/RocLee/archive/2013/05/28/3103481.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值