プロが教えるわが家の防犯対策術!

A(1000件)とB(500件)の2つのテーブルがあります。
この2つをキーでつなぎ、Aの全てのデータを表示し、
2つの一致したデータのみにBの●・△・■のフィールドを追加したい。

【質問1】
2つを繋ぐ完全一致のキーがありませんので
まずは電話番号で確認し、その後住所、その後名前と・・・
最終的にはこの3つの内ひとつでも一致したものにBのフィールドを
追加したいのですが、どのようにするのがベストでしょうか?


【質問2】
ABのテーブルどちらにも重複したデータが含まれている場合
2つを繋ぎ“Aの全てのレコードとBの同じ結合フィールドのレコードだけを含める”
にチェックを入れてもAの1000件を超えて表示されます。
通常、“Aの全てのレコードとBの同じ結合フィールドのレコードだけ”なので
表示されるレコードは1000件ですよね?
重複データを削除する以外に1000件で表示する方法はないのでしょうか?

よろしくお願い致します。

A 回答 (2件)

クエリでテーブルを更新するのは難しい


のでは。

(1)

質問の●・△・■ を順番に、
F1、F2、F3とします。

もし、●・△・■ が一つの
フィールドならば少しコードを
変える必要があります。


以下のSQL文でクエリを作ります。
新しいクエリをSQLビューにして、
以下のSQL文をコピーし貼り付け、
保存します。名前を「クエリ差分」とします。

SELECT A.電話番号, B.F1, B.F2, B.F3
FROM A, B
WHERE (((A.電話番号)=[B].[電話番号])) OR (((A.住所)=[B].[住所])) OR (((A.名前)=[B].[名前]));



次に、フォームにボタンを一つ設定し、
名前を「cmd抽出」とします。
ボタン「cmd抽出」の上で右クリックして
プロパティシートを開き、その中の「クリック時」
のところで右端をクリックして、「ビルダの選択」
というフォームを表示し、その中の「コードビルダ」
を選択して、「OK」のボタンを押します。
コード表が開かれるので、表示されたコードを
以下のように設定します。


DAOを使っているので、コード表のツールから
参照設定を選択して、
Microsoft DAO xx Object Library
にチェックを入れて、OKとします。xxは3.6のような数字です。
このとき、
Microsoft ActiveX Data Objects xx Library
にチェックが入っていたらはずしてください。



Private Sub cmd抽出_Click()
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset

Set db = CurrentDb
Set rs1 = db.OpenRecordset("A", dbOpenDynaset)
Set rs2 = db.OpenRecordset("クエリ差分")

If rs2.RecordCount > 0 Then
rs2.MoveFirst
Do Until rs2.EOF
Do Until rs1.EOF
If rs2!電話番号 = rs1!電話番号 Then
rs1.Edit
rs1!F1 = rs2!F1
rs1!F2 = rs2!F2
rs1!F3 = rs2!F3
rs1.Update
Exit Do
End If
rs1.MoveNext
Loop
rs2.MoveNext
Loop
End If
rs1.Close: Set rs1 = Nothing
rs2.Close: Set rs2 = Nothing
db.Close: Set db = Nothing
End Sub



(2)
クエリのデザインビューで結合線の矢印がAからBに
向かっていますか。
フィールドには何を表示する設定になっていますか。
そのとき、表示するフィールドのテーブルは何を
指定していますか。

SQL文だと、

SELECT A.電話番号
FROM A LEFT JOIN B ON A.電話番号 = B.電話番号;

のようになっていますか。

この回答への補足

ご回答ありがとうございます。

今回、テーブルを更新するのではなく、表示のみでよかったので、
piroin654様よりお教えいただきました、差分クエリとAテーブルをつなぎ
目的のA+F1・F2・F3を表示する事ができました。
言葉が足りなかったようで大変お手数をお掛けしました。

(2)
>クエリのデザインビューで結合線の矢印がAからBに向かっていますか。
向かっています。

>フィールドには何を表示する設定になっていますか。
Aの全てとBのF1・F2・F3です。

>そのとき、表示するフィールドのテーブルは何を指定していますか。
Aの全てとBのF1・F2・F3です。

>SQL文だと、
>SELECT A.電話番号
>FROM A LEFT JOIN B ON A.電話番号 = B.電話番号;

このようになっています。↓
SELECT
FROM A LEFT JOIN B ON A.電話番号 = B.電話番号;

Bテーブルに重複がある限り仕方がないのですね。

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

補足日時:2011/04/17 12:02
    • good
    • 0

【質問1】


BのファイルをAに対してキーの数だけ結合します。
A-B1,B2,B3
A-B1の条件:B1!電話番号=A!電話番号
A-B2の条件:B2!住所=A!住所
A-B3の条件:B3!名前=A!名前

●1:SWITCH(B1!電話番号=A!電話番号,B1!●,B2!住所=A!住所,B2!●,B3!名前=A!名前,B3!●,True,Null)

【質問2】
>表示されるレコードは1000件ですよね?
Bに同じキーが重複するとひとつのAレコードに複数の結合になる為、1000件を超えます。
集計のグループ化でAのキー(電話番号,住所,名前)をグループ化して
B側の表示する内容を先頭か最後にしてください。

この回答への補足

ご回答ありがとうございます。
すみません、なにせ初心者の為、回答を理解出来ません。
申し訳ありませんが、細かくお教え願いませんでしょうか?

【質問1】
AB間を3本の結合線で結ぶ。
その後のAーB1・AーB2・AーB3とは列を追加するのですか?
SWITCH関数はどこに入力するのですか?
SWITCHの●はBの追加するフィールドの事ですか?

【質問2】
集計のグループ化でAのキー(電話番号,住所,名前)をグループ化して・・・
Aテーブルには名前は同じでも備考の内容が異なっていたり、
グループ化できないフィールドがいくつかございます。

色々すみませんがよろしくお願い致します。

補足日時:2011/04/17 00:26
    • good
    • 0

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