2014-01-09 27 views
-2

我有以下SQL Server查詢,我想添加按順序的子句。有人可以看看QRY。更新SQL Server查詢按訂單條款

declare @variable int 
set @variable = 0 

UPDATE r_recipes_tmp 
SET @variable = stepId = @variable + 1 

我正在嘗試以下,沒有運氣。

declare @variable int 
set @variable = 0 

UPDATE r_recipes_tmp 
SET @variable = stepId = @variable + 1 
WHERE stepId IN (SELECT stepId 
       FROM r_recipes_tmp 
       WHERE recipename = 'test' 
       ORDER BY stepid DESC) 

謝謝

+2

在更新中進行訂購是沒有意義的。 –

+0

約翰說,子查詢中的一個訂單對於更新數據的最終結果沒有任何影響。 – mituw16

回答

0

似乎像你想的行中的stepId從大到小的順序進行排序,然後分配新的連續值stepId,但這次是在升序排列,所以基本上你想如果stepId是排序標準,則顛倒行的順序。或者,使用一個例子(你有沒有提供),把一排設置是這樣的:

stepId someColumn 
------ ---------- 
7  AAA 
4  BBB 
2  DDD 
1  CCC 

到這一點:

stepId someColumn 
------ ---------- 
1  AAA 
2  BBB 
3  DDD 
4  CCC 

如果情況確實如此,如果你正在使用SQL Server 2005或更高版本,你可以使用一個CTEROW_NUMBER() function這樣的:

WITH newIDs AS (
    SELECT 
    stepId, 
    newStepId = ROW_NUMBER() OVER (ORDER BY stepId DESC) 
    FROM atable 
) 
UPDATE newIDs 
SET stepId = newStepId 
; 

ROW_NUMBER函數在stepId從大到小的順序分配行號,保留將它們與相應的當前值stepId並列。由於newIDs CTE從單個表中導出行,因此可以更新CTE,因此可以將其用作UPDATE的目標,並簡單地爲每個stepId分配新生成的行號。

+0

運行查詢時,我收到「關鍵字'DESC'附近的語法錯誤」錯誤。 – Alsjka

+0

這是我身邊的一個愚蠢的錯誤。 「PARTITION BY」實際上應該是「ORDER BY」。請參閱更新的版本。 –

+0

謝謝。我試圖通過「stepid」命令然後重新編號這些值。你的qry工作在重新編號,但不先排序然後重新編號。除非我錯過了某些東西,否則我的數據將保持不變。我做錯了什麼? – Alsjka