代码大致如下:
WITH cte AS
(
SELECT TOP 4 id, due_date, check
FROM table_a a
INNER JOIN table_b b ON a.linkid = b.linkid
WHERE
b.status = 1
AND due_date > GetDate()
ORDER BY due_date, id
)
UPDATE cte
SET check = 1
OUTPUT
INSERTED.id,
INSERTED.due_date
注意:实际数据具有相同的due_date。
当我只在cte中运行SELECT语句时,我可以得到结果,例如:1,2,3,4。 但是在UPDATE语句之后,更新的结果是:4,1,2,3
为什么会发生这种(订单变更)?
如何在同一个查询中将结果保留或重新排序回1,2,3,4?
答案 0 :(得分:0)
在MSDN https://msdn.microsoft.com/pl-pl/library/ms177564(v=sql.110).aspx中,您可以阅读
无法保证更改的应用顺序 到表和行插入的顺序 输出表或表变量将对应。
这意味着只用一个查询就无法解决问题。但是你仍然可以使用一批来做你需要的。由于您的输出不保证订单,因此您必须将其保存在另一个表中并在更新后对其进行排序。此代码将按以下假设返回输出值:
declare @outputTable table( id int, due_date date);
with cte as (
select top 4 id, due_date, check
from table_a a
inner join table_b b on a.linkid = b.linkid
where b.status = 1
and due_date > GetDate()
order by due_date, id
)
update cte
set check = 1
output inserted.id, inserted.due_date
into @outputTable;
select *
from @outputTable
order by due_date, id;