1

私は、MSAccess2007で非常に簡単に実行できるはずの処理方法をかなり長い間探していました。

受信したファイルの数をタイプごと、日ごとに追跡するメインテーブルitems_movedがあります。基本的な構造は次のとおりです。

ID(自動番号)、ドライブ(テキスト)、タイプ(テキスト)、日付(DateTime)、file_count(番号)、file_size(番号)

一般的なデータは次のようになります。

1777, F:\snaps, pics, 6/09/2010, 66, 151616131
1778, F:\snaps, pics, 6/10/2010, 5, 464864
1779, G:\pics, pics, 6/09/2010, 58, 45645646
1780, G:\pics, pics, 6/10/2010, 70, 123456667

まったく同じデータ構造の一時テーブルがあります。一時テーブルは、items_movedテーブルの最終日から開始(およびそれを含む)して、何が新しいかを見つけることによって生成されます。

一般的なデータは次のようになります。

1, F:\snaps, pics, 6/10/2010, 366, 6531616131
2, F:\snaps, pics, 6/11/2010, 5, 464864
3, G:\pics, pics, 6/10/2010, 70, 123456667
4, G:\pics, pics, 6/11/2010, 56, 123645964

私がやろうとしているのは、一時テーブルをメインテーブルに追加して、次のようにすることだけです。

  1. 重複はありません(ドライブと日付に基づく)
  2. 一時テーブルに一致するドライブと日付、およびそれより大きい値がある場合、メインテーブルが上書きされます
  3. 行が一時テーブルに存在するがメインテーブルには存在しない場合、その行はメインの末尾に追加されます。

結果はitems_movedテーブルにあり、1-1776は変更されずに記録されますが、次のように終了します。

1777, F:\snaps, pics, 6/09/2010, 66, 151616131         (Unchanged)
1778, F:\snaps, pics, 6/10/2010, 366, 6531616131       (Updated temp was larger)
1779, G:\pics, pics, 6/09/2010, 58, 45645646           (unchanged)
1780, G:\pics, pics, 6/10/2010, 70, 123456667          (unchanged)
1781, F:\snaps, pics, 6/11/2010, 5, 464864             (added)
1782, G:\pics, pics, 6/11/2010, 56, 123645964          (added)

私は考えられる結合のすべてのバリエーションを試しました。

日付が一致する行を取得できるので、それを更新ステートメントに使用できます。items_movedテーブルに一致する日付がない一時的な行を取得できないため、挿入を実行できません。

最後のポイントは、ユーザーがアクセスデータベースからレポートを要求したときに、VBアクションの一部としてこれを実行することです。

これがスニペットです

INSERT INTO items_moved (drive, type, file_date, file_count, file_size) 
 SELECT 'F:\snaps','pics', temp_table.created, Count(temp_table.created),
  Sum(temp_table.size) FROM temp_table where temp_table.drive = 'F:\snaps' 
  GROUP BY temp_table.created

これは機能しますが、テーブルの最後に追加するだけです。重複の問題が残っています。テーブルをその場で重複排除する方法があると確信していますが、それは無駄のようです。unionを使用するためのヒントをいくつか見つけましたが、 unionを使用してunion内のテーブルの1つを更新する方法については何もありません。

任意の入力をいただければ幸いです。ありがとう。

4

1 に答える 1

0

一致はドライブ、タイプ、および日付にあるようです。そのため、新しいレコードの場合、おそらく次のようになります。

INSERT INTO items_moved (drive, type, file_date, file_count, file_size) 
SELECT t.drive, type, t.file_date, t.file_count, t.file_size 
FROM temp_table t
LEFT JOIN items_moved m
ON t.Drive = m.Drive AND t.Type = m.Type and t.file_date = m.file_date
WHERE m.ID Is Null

更新には 2 番目のクエリが必要です。

UPDATE items_moved  m
INNER JOIN temp_table t
ON t.Drive = m.Drive AND t.Type = m.Type and t.file_date = m.file_date
SET m.file_count = t.file_count, m.file_size = t.file_size
WHERE m.file_size < t.file_size

またはそこについて。これはあなたが意味するものですか?

于 2012-06-10T18:23:06.060 に答える