
下記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 えむえすえぬ
No.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
早速、教えていただいたとおりに実行してみました!
まさしくやりたかった通りの結果になりなりました!!
また、別テーブルしていただいたり、抽出量が多かった場合の事も考量いただき
大変感謝しております。
数日かけて色々試してみましたがなかなかうまくいかずとても困っておりました。
世の中には本当に凄い人がいるもんだと感動しております。
教えていただいたものをすべて理解できるようにこれからも勉強していきたいと思います。
本当にありがとうございました!!
No.1
- 回答日時:
確認ですが、ポータルサイト名も含めるとフィールド数は
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でもこの処理が可能であれば、方法を教えていただきたいです。よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 赤ちゃん 子供の名前 5 2023/06/29 15:29
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- 教えて!goo 知恵袋とおしえてぐーが統合したらどうなりますか? 5 2022/08/25 15:55
- C言語・C++・C# 略語の読み方について 2 2023/05/25 12:35
- その他(悩み相談・人生相談) 高校1年生です。 少し前から外出してお店に入ると吐き気やぼーっとする感じがあります。 吐き気はまだい 6 2022/08/02 19:11
- 浮気・不倫(恋愛相談) 今現在の彼は半年ほど前まで複数のセフレがいたようです まだ付き合って2ヶ月あまり ふと気になったので 6 2022/09/02 03:02
- 友達・仲間 オーバーリアクションの人って、あんまり話を聞いてないんですかね? 6 2022/11/18 13:24
- LINE 送信取り消しについて 2 2022/10/30 18:18
- フィギュア・ドール・ぬいぐるみ ぬいぐるみはきれいな状態で何年持つ? 4 2022/12/03 11:47
- その他(ソフトウェア) 時間差でのオートクリック 1 2023/04/12 12:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
accessのレポートで元になるテ...
-
SQLServer2005のSQL文での別名...
-
INSERT INTO ステートメントに...
-
accessで重複を防ぎたい
-
ACCESSで和暦を西暦に・・・
-
SQLで特定の文字を含むものを削除
-
ACCESSでテーブルのチェックを...
-
ACCESS検索★ある文字を複数のフ...
-
view作成時にデータ型を変更し...
-
Access の非連結テキストボック...
-
【Access】フォームで自動計算...
-
ACCESSで400以上のフィールドが...
-
アクセス メモ型 255文字...
-
Accessでテーブルの値をテキス...
-
Access 昇順・降順で並び替え...
-
通貨型で\\0の時、何も表示しな...
-
アクセス A列コピー B列貼り...
-
100万レコード規模のaccessDBテ...
-
Accessで連続データってできま...
-
電話番号のデータの書式を変換...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INSERT INTO ステートメントに...
-
Accessのフィールド数が255しか...
-
ACCESSで400以上のフィールドが...
-
SQLServer2005のSQL文での別名...
-
アクセス エラーを数値「0」に...
-
accessのレポートで元になるテ...
-
Accessでテーブルの値をテキス...
-
ACCESSでの改行コード
-
ACCESSでテーブルのチェックを...
-
ExcelのデータをコピーでACCESS...
-
ACCESS検索★ある文字を複数のフ...
-
Access 昇順・降順で並び替え...
-
アクセス メモ型 255文字...
-
アクセス A列コピー B列貼り...
-
【Access】フォームで自動計算...
-
ACCESSでオートナンバーを任意...
-
Access:リンクテーブルマネー...
-
ACCESS VBAにてCSV...
-
Accessで、固定アルファベット+...
-
主キーはオートナンバー型のID...
おすすめ情報