1つだけ過去を変えられるとしたら?

Accessにおいて、
(1)A列、B列、C列をもつデータがテーブルにあります。

これに対して、
(2)A列、B列、C列、D列、E列をもつデータがテーブルに別途あるとします。


(1)に対して、(2)はA列、B列、C列に合致しているデータがいくつあるのか、
           A列、B列のみ合致しているデータがいくつあるのか、
          A列のみ合致しているデータがいくつあるのか、
          A,B,Cいずれも合致していないデータはいくつあるのか?

それぞれのデータを(1)と照らし合わせて(2)から抜き出そうとした場合には、
どのような抽出方法が効率いいのでしょうか?またクエリーは複数に
なってもかまわないのですが、いずれかで抽出された(2)のデータはいずれも
重複して抽出されない、かぶらない(上から順に抽出をかける)ことを前提にした場合の
もっとも適な抽出方法はありますでしょうか。


以下はおまけです(もし余力があれば)


また3つ合致しているデータにはそのレコードの横に列を新しく追加して1とふる、
  2つ合致しているのはそのコードの横に列を新しく追加して2とふる
  1つ合致しているのはそのコードの横に列を新しく追加して1とふる
  0つ合しているのはそのレコードの横に列を新しく追加して0とふる、
という作業をAccessでするとした場合、一致クエリー&更新クエリー&マクロ等で
実現できるのでしょうか?



もしよいお知恵あればご教授いただきたく、
お願いいたします。

A 回答 (2件)

>ABC一致


>AB一致
>AC一致
>BC一致
>A一致
>B一致
>C一致
>全て一致しない

7つのクエリを作成して、ユニオンクエリで不一致クエリを作成してから「全て一致しない」を作る方向とします。
名前は以下の9つ。


Q1_ABCとも一致
Q2_ABのみ一致
Q3_ACのみ一致
Q4_BCのみ一致
Q5_Aのみ一致
Q6_Bのみ一致
Q7_Cのみ一致
Q8_ユニオンクエリ
Q9_全て一致しない(Where条件を変えていろいろ検証)

デザインビューでは説明できないので、SQL文を書きます。
クエリの新規作成>デザインビュー>テーブルの表示(なし)でSQLビューにして
SQL文をコピペしてください。
「Q8_ユニオンクエリ」の他はデザインビューに切り替えて構造をみてください。
SQL文の前一行はクエリ名です。

Q1_ABCとも一致
select T2.列A, T2.列B, T2.列C, T2.列D, T2.列E, 3 AS 評価
from T1 inner join T2 on (T1.列A = T2.列A AND T1.列B = T2.列B AND T1.列C = T2.列C)
;

Q2_ABのみ一致
select T2.列A, T2.列B, T2.列C, T2.列D, T2.列E, 2 AS 評価
from T1 inner join T2 on (T1.列A = T2.列A AND T1.列B = T2.列B)
where T1.列C <> T2.列C
;

Q3_ACのみ一致
select T2.列A, T2.列B, T2.列C, T2.列D, T2.列E, 2 AS 評価
from T1 inner join T2 on (T1.列A = T2.列A AND T1.列C = T2.列C)
where T1.列B <> T2.列B
;

Q4_BCのみ一致
select T2.列A, T2.列B, T2.列C, T2.列D, T2.列E, 2 AS 評価
from T1 inner join T2 on (T1.列B = T2.列B AND T1.列C = T2.列C)
where T1.列A <> T2.列A
;

Q5_Aのみ一致
select T2.列A, T2.列B, T2.列C, T2.列D, T2.列E, 1 AS 評価
from T1 inner join T2 on (T1.列A = T2.列A)
where T1.列B <> T2.列B AND T1.列C <> T2.列C
;

Q6_Bのみ一致
select T2.列A, T2.列B, T2.列C, T2.列D, T2.列E, 1 AS 評価
from T1 inner join T2 on (T1.列B = T2.列B)
where T1.列A <> T2.列A AND T1.列C <> T2.列C
;

Q7_Cのみ一致
select T2.列A, T2.列B, T2.列C, T2.列D, T2.列E, 1 AS 評価
from T1 inner join T2 on (T1.列C = T2.列C)
where T1.列B <> T2.列B AND T1.列C <> T2.列C
;

Q8_ユニオンクエリ
select * from Q1_ABCとも一致
union
select * from Q2_ABのみ一致
union
select * from Q3_ACのみ一致
union
select * from Q4_BCのみ一致
union
select * from Q5_Aのみ一致
union
select * from Q6_Bのみ一致
union
select * from Q7_Cのみ一致
;

Q9_全て一致しない
select T2.列A, T2.列B, T2.列C, T2.列D, T2.列E, T1.評価
from T2 left join Q8_ユニオンクエリ AS T1 on (T1.列A = T2.列A AND T1.列B = T2.列B AND T1.列C = T2.列C)
where T1.評価 is null
;

ベン図も添付しておくので、各クエリがどこの部分に相当するのか、評価の値で確認してください。
デザインビューに変更して、評価を非表示にすれば、再利用できますが
その前にQ9のwhere条件を色々変えて検証してください。
また、Q8_ユニオンクエリで調整してもOKです。

なお、検証のためには、T2の列A、列B、列Cに、それぞれ値[0、1、2]の3×3×3=27レコードを、
T2の列A、列B、列Cに、それぞれ値[1]のみの1レコードで用意されると良いと思います。

列D・列Eに関してはご自身で進めてみてください。
「マイクロソフト Accessのクエリーに」の回答画像2
    • good
    • 0
この回答へのお礼

ありがとうございます。これほど丁寧に、感謝です。

お礼日時:2012/01/31 01:55

ACCESSのバージョン記載がないので、2003までと007以降の差はご自身で吸収してください。



基本操作
1)クエリのデザインビューで、選択クエリを新規作成する。
2)[テーブルの表示]でテーブル1(列A・B・C)とテーブル2((列A・B・C・D・E)を追加して[OK]
3)テーブル2のタイトルをダブルクリックして、すべての列が選択されたら、デザイングリッドへドラッグ&ドロップ。
4)テーブル1の列Aをドラッグしてテーブル2の列A上でドロップ。
5)テーブル1の列Bをドラッグしてテーブル2の列B上でドロップ。
6)テーブル1の列Cをドラッグしてテーブル2の列C上でドロップ。
7)赤い!マークで実行。
これで「A列、B列、C列に合致しているデータ」が表示されるので、最終レコードを見れば「いくつあるのか」がわかります。
「A列、B列に合致しているデータ」は6)を行わないで7)実行
「A列に合致しているデータ」は5)6)を行わないで7)実行。

> A,B,Cいずれも合致していないデータはいくつあるのか?
表現があいまいですね。列Bのみ合致するものはどうすれば良いですか?

> 重複して抽出されない、かぶらない(上から順に抽出をかける)ことを前提にした場合の
表現があいまいですね。列Aが合致しても、列Bが合致するもの・しないものがありますよね。どうします?

クエリの新規作成するときに「不一致クエリ ウィザード」で作成してから、デザインビューで構造を参照すると良いかも。

>また3つ合致しているデータにはそのレコードの横に列を新しく追加して1とふる、
>  2つ合致しているのはそのコードの横に列を新しく追加して2とふる
>  1つ合致しているのはそのコードの横に列を新しく追加して1とふる
>  0つ合しているのはそのレコードの横に列を新しく追加して0とふる、
デザイングリッドで、評価用列を3つ作って、それぞれでIIFを用い、条件一致すれば1を不一致なら0を返す列を設け、その結果3つを合計する列を表示すれば可能です。

この回答への補足

bin-chanさん


回答ありがとうございます。私のイメージと同じでしたので安心しました。
以下についてですが、、

> A,B,Cいずれも合致していないデータはいくつあるのか?
表現があいまいですね。列Bのみ合致するものはどうすれば良いですか?


できるのであれば、
ABC一致
AB一致
AC一致
BC一致
A一致
B一致
C一致
全て一致しない

の全てを重複しない形で引っ張りたいです。


それを
以下のように符号をつけることにおいて、不一致クエリーでカバーできますか????


クエリの新規作成するときに「不一致クエリ ウィザード」で作成してから、デザインビューで構造を参照すると良いかも。

>また3つ合致しているデータにはそのレコードの横に列を新しく追加して1とふる、
>  2つ合致しているのはそのコードの横に列を新しく追加して2とふる
>  1つ合致しているのはそのコードの横に列を新しく追加して1とふる
>  0つ合しているのはそのレコードの横に列を新しく追加して0とふる、


このあたり差し支えなければもう少し詳しくお伺いできればと幸いです。
更新クエリーを活用しようと思っていたので、

デザイングリッドで、評価用列を3つ作って、それぞれでIIFを用い、条件一致すれば1を不一致なら0を返す列を設け、その結果3つを合計する列を表示すれば可能です。

補足日時:2012/01/29 15:42
    • good
    • 0
この回答へのお礼

お礼日時:2012/01/29 19:30

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