2016-07-01 51 views
-1

的代碼大致是這樣的:做CTE選擇排序,然後更新後,更新的結果是沒有順序相同(TSQL)

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 4.但是在UPDATE語句之後,更新的結果是:4,1,2, 3

這是爲什麼(訂單更改)發生?

如何在同一個查詢中保留或重新排序結果回到1,2,3,4?

+0

我很難找出你實際上正在努力實現這個東西,但我懷疑數據的順序是不同的,但它更下降到您的選擇VS輸出子句,因爲你的輸出沒有排序。 –

+1

沿着[Microsoft](https://msdn.microsoft.com/en-us/library/ms177564.aspx),訂單不會與OUTPUT子句一起保證,因此您必須將此OUTPUT替換爲新的'SELECT TOP 4 id,due_date ...' – Polux2

+0

@ AllanS.Hansen對不起,如果我的問題不清楚。我正在嘗試在cte select和更新後達到相同的順序。我認爲更新後訂單不會改變。 – kurakura88

回答

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; 
+0

謝謝!我沒有意識到更新後的順序中沒有保證。我想這(一批)是我唯一的選擇,保持訂單不變。 – kurakura88