Toa*_*oad 49 sql t-sql sql-server sql-order-by sql-update
理想情况下我想这样做:
UPDATE TOP (10) messages SET status=10 WHERE status=0 ORDER BY priority DESC;
Run Code Online (Sandbox Code Playgroud)
英文:我想从数据库中获取前10个可用(状态= 0)消息并锁定它们(状态= 10).应首先获得具有更高优先级的消息.
遗憾的是,MS SQL不允许更新中的order by子句.
无论如何如何规避这个?
Qua*_*noi 102
WITH q AS
(
SELECT TOP 10 *
FROM messages
WHERE status = 0
ORDER BY
priority DESC
)
UPDATE q
SET status = 10
Run Code Online (Sandbox Code Playgroud)
小智 43
您可以执行子查询,首先获取按优先级排序的前10个的ID,然后更新该子查询上的ID:
UPDATE messages
SET status=10
WHERE ID in (SELECT TOP (10) Id
FROM Table
WHERE status=0
ORDER BY priority DESC);
Run Code Online (Sandbox Code Playgroud)
我必须提供一个更好的方法 - 您并不总是拥有身份字段的奢侈:
UPDATE m
SET [status]=10
FROM (
Select TOP (10) *
FROM messages
WHERE [status]=0
ORDER BY [priority] DESC
) m
Run Code Online (Sandbox Code Playgroud)
您还可以根据需要使子查询变得复杂 - 加入多个表等...
为什么这样更好?它不依赖于表中标识字段(或任何其他唯一列)的存在messages。它可用于更新任何表的前 N 行,即使该表根本没有唯一键。
| 归档时间: |
|
| 查看次数: |
90105 次 |
| 最近记录: |