- ベストアンサー
ACCESS2010 SQLでデータの統合
- ACCESS2010を使用して、データの統合を行いたい場合の方法を教えてください。
- 似たような方法を試してみましたが、うまくいきません。
- 統合後のデータの形式についてもご教示いただければ幸いです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
直接テーブルに書き込むこともできますが、安全を 考えて、新しいテーブルにデータをすべて書き出す ことにしました。 質問のテーブル名を「Tポータルサイト」とします。 準備として「Tポータルサイト」と同じ構造の 空のテーブルを一つ用意をしておいてください。 名前を「T書き込み用」とします。 そのとき、フィールドの数を適当に増やして置いて ください。見た目は同じでも空白や改行コードが 入っていると違うデータとして判断します。どちらかと 言えば、目いっぱい設定しておくほうがいいかもしれません。 たとえば、yahoo! というポータル名がたくさん存在 するならばそれだけ一目では分かりにくいデータ が紛れ込んでいる可能性もあります。 なお、フィールド名は先頭の「ポータル名」だけは 固定で、あとはどのようなフィールド名でも かまわないようになっています。「ポータル名」 も実際に合わせて変更してください。 もし、実行後、データの抽出数が予定より 多い場合は、たとえば、 SELECT * FROM Tポータルサイト WHERE (((Tポータルサイト.ポータルサイト名)="yahoo!")); のように、特定のポータルサイト名を指定して確認、修正も できます。 では、以下のコードを実行してみてください。 一応、DAOで記述しています。 なお、参照設定で Microsoft Scripting Runtime にチェックを入れてください。DAOのチェックの確認も。 Sub testポータル() Dim db As DAO.Database Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim rs3 As DAO.Recordset Dim strSQL As String Dim dic As Object Dim v As Variant Dim k As Variant Dim i As Long Dim j As Long 'テーブルのポータルサイト名の名寄せのSQL文 strSQL = "SELECT ポータルサイト名 FROM Tポータルサイト GROUP BY ポータルサイト名;" Set db = CurrentDb Set rs1 = db.OpenRecordset("Tポータルサイト") Set rs2 = db.OpenRecordset(strSQL) Set rs3 = db.OpenRecordset("T書き込み用", dbOpenDynaset) Set dic = CreateObject("Scripting.Dictionary") If rs2.RecordCount > 0 Then rs2.MoveFirst Do Until rs2.EOF If rs1.RecordCount > 0 Then rs1.MoveFirst Do Until rs1.EOF For i = 0 To rs1.Fields.Count - 1 v = rs1.Fields(i).Value If rs2!ポータルサイト名 = rs1!ポータルサイト名 Then '配列へデータ格納 If Not IsNull(rs1.Fields(i)) Then If Not dic.Exists(v) Then dic.Add v, v End If End If End If Next i rs1.MoveNext Loop End If 'テーブルへデータの書き込み k = dic.Keys rs3.AddNew For j = 0 To dic.Count - 1 rs3.Fields(j) = k(j) Next j rs3.Update dic.RemoveAll rs2.MoveNext Loop End If Set dic = Nothing rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing rs3.Close: Set rs3 = Nothing db.Close: Set db = Nothing End Sub
その他の回答 (2)
- yorozu_ya
- ベストアンサー率54% (76/140)
おやりになりたいことはデータベースの正規化とは真逆です。 データベースの正規化について勉強しましょう。
- piroin654
- ベストアンサー率75% (692/917)
確認ですが、ポータルサイト名も含めるとフィールド数は 201になります。統合した場合、かなフィールドも含めて 最大どのくらいのフィールド数になる可能性がありますか。 あるいは質問の例からすると現在データが書き込まれている フィールドは最大で201、統合すると202(ポータルサイト名 も含めて)ということでしょうか。 いずれにしてもVBAを使うことになるとは思いますが。 ただ、テーブルのフィールド数は制限があり255までです。
補足
piroin654さん、ご投稿いただきありがとうございます。 おっしゃる通りで最大フィールド数が201(ポータルサイト名1+かなフィールド200)と考えております。 統合のたびにフィールド数が増えるわけではなく、あらかじめ名がついた201のフィールドが用意してあり 現在はその内"ポータルサイト名"がMSN迄、フィールドは"かな3"迄データがはいっている状態になります。 同Aテーブルにyahooとgooのかなデータがアップされたので(「Aテーブル:統合前」の状態です。) それを元々テーブルで持っていたyahooとgooのデータと統合して、統合後の状態にしたいというのが理想です。 質問例ではyahooもgooも"かな4"からデータを統合させればいいので、通常のクエリでもできると 思うのですが、これがyahooとmsnだった場合、yahooは"かな4"からデータがはいり、msnは "かな2"からデータが入るようにしたい(右詰で空欄をつくらない)と思っています。 うまく説明ができないうえ、質問のテーブル例に失敗してしまいすみません。。。。。 余計ややこしくしましたでしょうか? もし、VBAでもこの処理が可能であれば、方法を教えていただきたいです。よろしくお願いいたします。
お礼
早速、教えていただいたとおりに実行してみました! まさしくやりたかった通りの結果になりなりました!! また、別テーブルしていただいたり、抽出量が多かった場合の事も考量いただき 大変感謝しております。 数日かけて色々試してみましたがなかなかうまくいかずとても困っておりました。 世の中には本当に凄い人がいるもんだと感動しております。 教えていただいたものをすべて理解できるようにこれからも勉強していきたいと思います。 本当にありがとうございました!!