Microsoft Access ClubAccess超初心者対象ForumAccess初級者対象ForumAccess初・中級者対象ForumAccess VBA Tips ForumDAO、ADO、SQL Forum

     

No34057.重複したレコードを最新のものだけ残したいのですが・・・

タイトル重複したレコードを最新のものだけ残したいのですが・・・
記事No: 34057
投稿日: 2005/06/30(Thu) 09:14
投稿者: kuni
OS:Windows2000
Access Version:2000

初めまして。kuniと申します

現在、各営業所からデータを集計して、
顧客管理ソフトのマスタを一気に更新するソフトを作成しております。

イメージとしては、各営業所で修正したデータをcsvファイルにまとめ、
ソフト内に新しいテーブルを作って保存。
次にソフトのマスタ内にある該当データを削除、
作成した新しいテーブルから必要なデータを抽出し、
マスタ内に追加するという感じで考えています。

まずcsvファイルを新しいテーブルとしてソフト内に取り込むことには成功したのですが、
このテーブル内に重複したレコードがあり、その処理に困っております。

テーブル構造
 ID |代表者名|勤務先|シェア|   更新日時 
―――――――――――――――――――――――――――
00001| 三浦 |A社 |1位 |2005/5/15 12:00
00001| 三浦 |B社 |2位 |2005/5/15 11:30
00002| 武田 |C社 |2位 |2005/6/20 15:20
00003| 中山 |D社 |4位 |2005/5/11 12:00
00003| 中山 |D社 |3位 |2005/5/11 16:00
00003| 中山 |E社 |2位 |2005/6/20 9:00

このようなレコードテーブル構造になっております。
同じ顧客について何度も修正することがあるので、
マスタでは主キーになっているIDフィールドが、
ここでは重複する場合があります。
また、更新日時についても、各営業所で更新したデータを
集計する関係上、必ずしもユニークになるとは限りません。

希望としては、このテーブルを以下のカタチにしたいと考えております。


 ID |代表者名|勤務先|シェア|   更新日時 
―――――――――――――――――――――――――――
00001| 三浦 |A社 |1位 |2005/5/15 12:00
00002| 武田 |C社 |2位 |2005/6/20 15:20
00003| 中山 |E社 |2位 |2005/6/20 9:00


つまり、IDが重複しているレコードに関しては、
代表者、勤務先、シェアが変更されている・いないに限らず、
更新日時が一番新しいレコードのみ残したいと考えています。

重複クエリや削除クエリを使っても上手くいかず…

文章が下手で、わかりにくいところもあるかと思いますが、
何かお考えのある方、アドバイスよろしくお願い致します。

タイトルRe: 重複したレコードを最新のものだけ残したいのですが・・・
記事No: 34058
投稿日: 2005/06/30(Thu) 09:48
投稿者: TWEST
テーブル作成クエリ

SELECT * INTO NewTable
FROM
OldTable AS T1
WHERE
T1.更新日時 = (SELECT MAX(更新日時) FROM OldTable As T2 Where T2.ID = T1.ID GROUP BY T2.ID);

を実行すれば、OldTableからレコードが抽出され、NewTableが作成されます。

タイトルRe^2: 重複したレコードを最新のものだけ残したいのですが・・・
記事No: 34059
投稿日: 2005/06/30(Thu) 09:50
投稿者: TWEST
NewTableが既に存在するなら

追加クエリ
INSERT INTO NewTable
SELECT *
> FROM
> OldTable AS T1
> WHERE
> T1.更新日時 = (SELECT MAX(更新日時) FROM OldTable As T2 Where T2.ID = T1.ID GROUP BY T2.ID);

です。

タイトルRe: 重複したレコードを最新のものだけ残したいのですが・・・
記事No: 34060
投稿日: 2005/06/30(Thu) 09:51
投稿者: hatena
このテーブルからクエリを作り、更新日時 フィールドの抽出条件を

DMax("更新日時","テーブル名","ID='" & [ID] & "'")

としたら、希望の出力になると思います。

元のテーブルからそれ以外のレコードを削除したいと言うことなら、
条件を

<DMax("更新日時","テーブル名","ID='" & [ID] & "'")

として、削除クエリにすればどうでしょうか。

IDは、テキスト型との前提です。数値型の場合は、' は不要です。

タイトルRe: 重複したレコードを最新のものだけ残したいのですが・・・
記事No: 34061
投稿日: 2005/06/30(Thu) 09:52
投稿者: Benkei
> テーブル構造
>  ID |代表者名|勤務先|シェア|   更新日時 
> ―――――――――――――――――――――――――――
> 00001| 三浦 |A社 |1位 |2005/5/15 12:00
> 00001| 三浦 |B社 |2位 |2005/5/15 11:30
> 00002| 武田 |C社 |2位 |2005/6/20 15:20
> 00003| 中山 |D社 |4位 |2005/5/11 12:00
> 00003| 中山 |D社 |3位 |2005/5/11 16:00
> 00003| 中山 |E社 |2位 |2005/6/20 9:00
↑               ↑
グループ化           Max
00001| |2005/5/15 12:00
00002| |2005/6/20 15:20
00003| |2005/6/20 9:00
を作って
元のテーブルと ID、更新日時 で結合すると
 ↓
>
>  ID |代表者名|勤務先|シェア|   更新日時 
> ―――――――――――――――――――――――――――
> 00001| 三浦 |A社 |1位 |2005/5/15 12:00
> 00002| 武田 |C社 |2位 |2005/6/20 15:20
> 00003| 中山 |E社 |2位 |2005/6/20 9:00

タイトルRe^2: 重複したレコードを最新のものだけ残したいのですが・・・
記事No: 34062
投稿日: 2005/06/30(Thu) 10:06
投稿者: kuni
TWESTさん、hatenaさん、Benkeiさん、レスありがとうございました!

三つの方法を伺い、試してみたのですが、
三つとも望みどおりの結果を得ることが出来ました!

同じ結果を手に入れるのでも、いろんな方法があるんですね。
勉強になりました!

もう少し試して、一番ソフトに適した方法を導入したいと思います。

ありがとうございました!

タイトルRe^2: 重複したレコードを最新のものだけ残したいのですが・・・
記事No: 34063
投稿日: 2005/06/30(Thu) 10:08
投稿者: 小僧
kuni さん、みなさま:
おはようございます。

一斉にレスが付けられていますね。

Benkei さんの考え方をクエリで表現してみました。
元のテーブルを「T_Temp」として

SELECT Q.ID, T_Temp.代表者名, T_Temp.勤務先, T_Temp.シェア, Q.更新日時
FROM [
SELECT T_Temp.ID, Max(T_Temp.更新日時) AS 更新日時
FROM T_Temp
GROUP BY T_Temp.ID
]. AS Q INNER JOIN T_Temp ON (Q.更新日時 = T_Temp.更新日時) AND (Q.ID = T_Temp.ID)
GROUP BY Q.ID, T_Temp.代表者名, T_Temp.勤務先, T_Temp.シェア, Q.更新日時;


上記SQLをクエリのSQLビューに記載して確認してみてください。

タイトルRe^3: 重複したレコードを最新のものだけ残したいのですが・・・
記事No: 34065
投稿日: 2005/06/30(Thu) 10:19
投稿者: kuni
小僧さん、レスありがとうございます。

なるほど、こういうやり方もあるんですね。

ACCESS全般について未熟な上、
SQLはそれに輪をかけて弱かったんですが、
これを機会に、SQLの勉強をしたいと思います。

ありがとうございました!


このAccessフォーラム過去ログ集は、Microsoft Access Club が運営しています

cPanel あるいは PLESKコントロールパネルをインストールした専用レンタルサーバのディスカウントプランを期間限定で公開しています。
cPanel・PLESKコントロールパネルを備えた専用レンタルサーバ....。

 

ページの先頭へ 前ページへ戻る