重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

下記Aテーブルのレコード統合して、統合後のようにしたいと思っています。
似たようなものをネットや本で探し、構文を装飾して色々試してみてますが
なかなかうまくいきません。SQLで実行したいのですが、お分かりになる方が
いらっしゃいましたら構文を教えていただきたいです。何卒、よろしくお願いいたします。

◆Aテーブル:統合前
(実際は"ポータルサイト"レコードは数千件、"かな"フィールドは1~200まである)

--------------------------------------------------------------------
ポータルサイト名      かな1         かな2     かな3     かな4

goo               ぐー           ぐう       ごー

YAHOO!          やっふー       やっほー   ヤフー     

Google            グーグル       ぐぐる     ぐーぐる

MSN              えむえすえぬ   

YAHOO!          やっふー       やっほー   ヤホウ

goo               ぐー           GOOO




◆Aテーブル:統合後

※※ポータルサイト名でかなを統合(重複しているかなは削除)

--------------------------------------------------------------------
ポータルサイト名      かな1         かな2     かな3     かな4

goo               ぐー           ぐう       ごー      GOOO

YAHOO!          やっふー       やっほー   ヤフー     ヤホウ

Google            グーグル       ぐぐる     ぐーぐる

MSN              えむえすえぬ   

          

A 回答 (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
    • good
    • 0
この回答へのお礼

早速、教えていただいたとおりに実行してみました!
まさしくやりたかった通りの結果になりなりました!!
また、別テーブルしていただいたり、抽出量が多かった場合の事も考量いただき
大変感謝しております。
数日かけて色々試してみましたがなかなかうまくいかずとても困っておりました。
世の中には本当に凄い人がいるもんだと感動しております。
教えていただいたものをすべて理解できるようにこれからも勉強していきたいと思います。
本当にありがとうございました!!

お礼日時:2011/09/20 14:39

おやりになりたいことはデータベースの正規化とは真逆です。



データベースの正規化について勉強しましょう。
    • good
    • 0

確認ですが、ポータルサイト名も含めるとフィールド数は


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でもこの処理が可能であれば、方法を教えていただきたいです。よろしくお願いいたします。

補足日時:2011/09/19 23:50
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!