2012-08-01 50 views
0

我已將Access數據庫遷移到MSSql服務器2008,並發現舊數據庫中存在一些異常。在這兩個數據庫ID上都是自動增量的,並且應該與日期一致。但如下圖所示,有些已按照錯誤的時間順序保存。MSSql批量更新主鍵上的表

**Access:** 
ID FileID DateOfTransaction SectionID 
64490 95900 02/12/1997 100 
64491 95900 04/04/1996 80 
64492 95900 25/03/1996 90 

**Desired Correct Format:** 
ID FileID DateOfTransaction SectionID 
64492 95900 02/12/1997 100 
64491 95900 04/04/1996 80 
64490 95900 25/03/1996 90 

PK(ID)表與更新級聯集相關聯的幾個其他表。 我需要按FileID進行分組並按DateOfTransaction進行排序並相應地更新ID。

我需要一些關於如何最好地解決這個問題的建議,因爲數據非常敏感。我有大約50K記錄要更新。

感謝您的閱讀!

回答

1

嘗試此查詢

with cte as 
(select * from (
    select *,ROW_NUMBER() over (partition by FileID 
    order by DateOfTransaction) as row_num 
    from t_Transactions) A 
join 
    (select ID B_ID, FileID B_FileID,ROW_NUMBER() 
    over (partition by FileID order by ID) as B_row_num 
    from t_Transactions) B 
on A.row_num=B.B_row_num) 

select T.ID [Old_ID], CTE.B_ID [New_ID], 
    T.FileID,T.DateOfTransaction,T.SectionID 
--update T set T.ID=CTE.B_ID 
from t_Transactions T join cte 
on T.ID=CTE.ID 
and CTE.B_FileID=T.FileID 

更新之前,您可以選擇和順應的結果

該查詢更新表按照您的要求。你已經提到ID列與其他幾個表相關聯。 請非常小心這一點,並確保更新ID列不會破壞任何東西

SQL Fiddle Demo

+0

不要成爲推動者!大聲笑 – ErikE 2012-08-01 08:41:33

0

我會認真考慮是否需要做到這一點的。是否有任何邏輯取決於較高日期的較高ID? Access數據庫中的數據是否無序,在這種情況下,這並不重要。

如果您決定繼續操作,請先備份數據。你可能會犯錯誤。

1

設計一個數據庫以依靠人工生成的鍵的順序來匹配另一列的日期順序是一種可怕的反模式,而不是最輕微的最佳實踐。

停止依靠它來表示廣告訂單。這就是答案。如果你需要這些數據,它應該是與你的PK分開的另一列。你不能按日期訂購嗎?如果沒有,請創建一個新列。

除了將行相互關聯以外,投入內部數據庫標識符以及任何類型的含義始終是錯誤的。

我在前僱主面前看到過這個確切的問題 - 而且數據庫也充斥着各種其他設計問題。 FK列實際上命名爲「frnkeyColumnName」以匹配它們指向的「keyColumnName」。不要介意也是FK的PK ...

停止瘋狂!