执行CTE选择Order By然后更新后,更新结果的顺序不同(TSQL)

时间:2016-07-01 10:50:54

标签: tsql sql-update common-table-expression sql-order-by

代码大致如下:

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?

1 个答案:

答案 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;