0

我已将 Access DB 迁移到 MSSql server 2008,并从旧数据库中发现了一些异常。在两个数据库上,ID 都是自动递增的,并且应该与日期一致。但如下图所示,有些是按错误的时间顺序保存的。

**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 记录要更新。

谢谢阅读!

4

3 回答 3

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 小提琴演示

于 2012-08-01T08:24:34.767 回答
1

将数据库设计为依赖人工生成的键的顺序来匹配另一列的日期顺序是一种糟糕的反模式,丝毫不是最佳实践。

停止依赖它来表示插入顺序。这就是答案。如果您需要该数据,它应该是与您的 PK 分开的另一列。无论如何,你不能按日期订购吗?如果没有,请创建一个新列。

除了将行相互关联之外,将具有任何含义的内部数据库标识符投资始终是错误的。

我以前曾在前雇主那里看到过这个确切的问题——数据库也充斥着各种各样的其他设计问题。FK 列实际上被命名为“frnkeyColumnName”以匹配它们指向的“keyColumnName”。别介意PK也是FK...

停止疯狂!

于 2012-08-01T08:37:49.017 回答
0

I would seriously consider whether you need to do this at all. Is there any logic that depends on higher IDs having a later date? Was the data out of order in the Access database, in which case, it doesn't matter.

If you do decide to proceed, back up the data first. You're probably going to make mistakes.

于 2012-08-01T08:28:39.747 回答