2017-04-07 48 views
-2

我有一個樣本數據集UPDATE SQL聲明(使用自聯接)到同一個表

BookID Book_Name Book_Version_Number New Book Version Number (Proposed) 
1  XYZ  1.0000    1.0000 
1  XYZ  1.0000    2.0000 
2  ABC  1.0000    1.0000 
2  ABC  1.0000    2.0000 
2  ABC  1.0000    3.0000 

所以,我需要逐步,依次更新由標題分組的新書版本號。 。

我需要把這樣的一個UPDATE SQL..My更新似乎沒有爲我的group by子句不工作

+0

請發表您的查詢結果您嘗試過哪些方面的問題 –

回答

0

你可以使用一個CTE和row_number()

;WITH CTE AS 
(
    SELECT BookId, 
      BookName, 
      Book_Version_Number, 
      ROW_NUMBER() OVER(PARTITION BY BookId ORDER BY (SELECT NULL)) As rn 
    FROM TableName 
) 

UPDATE CTE 
SET Book_Version_Number = rn 
+0

謝謝Zohar爲您的快速轉身和幫助。 ..目前工作到目前爲止。將做更多點檢查。問雖然...你爲什麼使用SELECT NULL ...只是試圖瞭解 –

+0

由於你沒有列排序反正,我更喜歡使用'order by(select null)',這樣當你閱讀你知道的sql不知道該命令是無關緊要的。 –

+0

好的,謝謝。我稍微修改使用ORDER BY BOOK_ID,它似乎工作正常。 –

0

我更喜歡使用common table expression (cte)來做這類事情。

使用row_number()

;with cte as (
    select * 
    , New_Book_Version_Number = row_number() over (
     partition by Book_Name /* Title */ 
     order by BookID 
     ) 
    from Books 
) 
update cte 
set Book_Version_Number = New_Book_Version_Number 

如果你想運行預覽更新之前的變化,只是改變上述的select而不是一個update。請注意,只有cte之後的第一條語句才能使用cte。