0

Access DBをMSSqlサーバー2008に移行しましたが、古いデータベースからいくつかの異常が見つかりました。両方のDBで、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を更新する必要があります。

データは非常に機密性が高いため、これに取り組む最善の方法についていくつかの提案が必要です。更新するレコードが約5万件あります。

読んでくれてありがとう!

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列は、実際には、ポイントした「keyColumnName」と一致するように「frnkeyColumnName」という名前が付けられました。FKでもあったPKを気にしないでください...

狂気を止めろ!

于 2012-08-01T08:37:49.017 に答える
0

私はあなたがこれをする必要があるかどうか真剣に考えます。日付が後の上位IDに依存するロジックはありますか?Accessデータベースのデータが故障していた場合、それは問題ではありません。

続行する場合は、最初にデータをバックアップしてください。あなたはおそらく間違いを犯すでしょう。

于 2012-08-01T08:28:39.747 に答える