アプリ版:「スタンプのみでお礼する」機能のリリースについて

ACCESS初心者です。
2つのテーブルのあるフィールドを比較して、
両方のフィールドに存在するデータであれば、それを抽出する
といったことをしたいのですが、どなたか手法を教えて下さい。
よろしくお願いします。

A 回答 (5件)

No.2・No.4です。



> 少し勉強のお付き合いをしていただいて良いでしょうか?

はい。
ではまず、前回作成して戴いたクエリを、それぞれ以下のように変更して下さい。
(SQL文はそれぞれ全文のコピー&ペースト(上書き)でOKです);

※「テーブル1→テーブル2」型 ; クエリ名=クエリA
SELECT DISTINCT テーブル1.データ1, "テーブル1" AS 由来
FROM テーブル1 LEFT JOIN テーブル2 ON テーブル1.データ1 = テーブル2.データ2
WHERE (((テーブル2.データ2) Is Null))
ORDER BY テーブル1.データ1;

※「テーブル1←テーブル2」型 ; クエリ名=クエリB
SELECT DISTINCT テーブル2.データ2, "テーブル2" AS 由来
FROM テーブル1 RIGHT JOIN テーブル2 ON テーブル1.データ1 = テーブル2.データ2
WHERE (((テーブル1.データ1) Is Null))
ORDER BY テーブル2.データ2;

<変更の概略と理由の説明>
・(1行目) Distinct
 →重複分を非表示(なくても可)
・(1行目) "テーブル○" As 由来
 →各データがどのテーブルにあったかがわかるようにするために追加
  (不要なら『SELECT DISTINCT テーブル○.データ○』に変更して下さい)
・(4行目) 非表示列での並べ替え指定を解除
 →「表示」のチェックと同様、全て「Null」なので不要
  (重複分を非表示にしようとした場合には、エラーの原因にもなります)


・・・以上で準備は終わりです。
「AとBどちらかだけ」のデータを1つにまとめて表示するためのSQL文は、以下のように
なります;
Select クエリA.データ1 As 表示列,クエリA.由来 From クエリA
UNION
Select クエリB.データ2 As 表示列,クエリB.由来 From クエリB;

 *このタイプのクエリ(ユニオンクエリといいます)は、デザインビューへの切替はできません。


「As 表示列」というのは、データ1・データ2を同一列として表示する際の名前の指定
です(指定しなくても同一列に扱われる場合もありますが、フィールド名が異なる場合は
こうして宣言してやった方が無難)。
 *クエリA・Bで「由来」を削除した場合、こちらの「,クエリ○.由来」も削除して下さい。


ちなみに上の文だと、元のテーブルやクエリの重複データは非表示(=1データに集約)です。
もし、重複分をそのまま表示したい場合は、元のクエリ(今回の例ではクエリA・クエリB)
の「DISTINCT(固有の値=はい)」の指定を解除した上で、

Select クエリA.データ1 As 表示列,クエリA.由来 From クエリA
UNION All
Select クエリB.データ2 As 表示列,クエリB.由来 From クエリB;

と、「Union」の後に「All」を追加すればOKです。
(どんなときに必要になるのかは私もわかっていないんですが・・・一応、参考までに)
    • good
    • 0
この回答へのお礼

どうもありがとうございます!
とても丁寧にわかりやすくご教授下さり、大変勉強になりました。
SQL文は正直良くわからないのですが、ACCESSでこんなことまで出来るとは思いませんでした。
ACCESSはほとんどEXCELの延長上でしか使ったことがなかったので。
長々とお付き合い下さり、感謝しております。
また疑問があったときは、ぜひ、お力をお借り願えたらうれしく思います。
この度は、どうも、ありがとうございました。m(_"_)m

お礼日時:2006/10/19 18:43

No.2です。



> 重複データは1つだけ表示されるように抽出したい

重複データというのが「出力フィールド全てが同じデータ」のことでしたら、
そのクエリのプロパティシートで「固有の値」を「はい」に設定するのが
一番簡単だと思います。

設定方法は以下の通りです;
 1)クエリをデザインビューで開く
 2)テーブル表示領域をダブルクリックして「クエリプロパティ」シートを開く
  (メニューからでも表示できますが、手元にAccess97しかなく、メニューの
   並びはバージョンによって異なった気がしますので、省略させて戴きます)
 3)「固有の値」を「はい」に設定

私の方への補足への回答は以上です。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

さて、前回に続いての横レスでYeti21さんには重ね重ね失礼をして申し訳ありませんが、

> 両方に存在しない(片方にしか存在しない)データを抽出

についても説明させて戴きます。
(但し、以下はあくまで「結合線で連結された1フィールドにおいて、データが一方にしか
 ないもの」を表示させるクエリについての説明です。もし、お望みのクエリが「複数の
 フィールドの全てが合致しないもの(一部は合致しても可)」を表示させるものだと、
 この方法ではできませんので、念のため・・・)

 1)クエリをデザインビューで開く
 2)フィールドを結合している線を右クリックし、表示されたメニューから
  「結合プロパティ」をクリック
  (この選択肢がない場合は、マウスカーソルの位置がずれている可能性あり)
 3)「'○○'の全レコードと'△△'の同じ結合フィールドの・・・」と表示されている
  ところのオプションボタンを選択し、「OK」をクリック
 4)結合線が「―」から「→」または「←」に変わるので、「その矢印の先側」のフィールド
  (まだ出力対象に追加されていない場合は追加する必要あり)に対して、画面下側の
  「抽出条件」欄に「Null」と入力
  (なお、そのフィールドの「表示」チェックは外しておきます;
   表示させても空欄(Null)になるだけなので)
  *「矢印の先側」;「A→B」であればB側のこと、です。

以上で、「A→B」の形であれば「矢印の元側」の「A」側だけにあるデータが、
「A←B」であれば「B」側だけにあるデータが表示されるクエリになります。


・・・さて、上のようにすると、「Aだけにあるデータ」「Bだけにあるデータ」が
表示されるクエリが別々にできるわけですが、ここからさらに「AまたはBの
どちらかだけにあるデータ」を表示させるクエリも作ることができます。
但し、そのクエリは「デザインビュー」では組むことができませんので、
「SQLビュー」という画面で、SQL文というものを扱う必要があります。
(どんなものかを見るには、クエリを開いた後、メニューで「表示(V)→SQL
 ビュー」を選択して下さい)

上で前置きした通り、お望みのクエリが「ある1フィールドで、一方にしかない
データ」を抽出するものでいいのかどうかがわかっていない状況ですので、
とりあえず今回はここまでの説明とさせていただきます。

上記の形で問題なく、また1つのクエリにまとめて表示させたいということ
でしたら、改めて説明致します。
(なお、その際は作成されたクエリのSQL文を貼り付けて戴ければ、多分
 私の方でクエリを1つにまとめることもできると思います;
 というか、そうして戴いた方が説明(?)が楽というのが正確なんですが)



・・・長文、失礼致しました。

この回答への補足

ありがとうございます。
大変ご丁寧なご説明をいただき感謝しています(>_<)
望んでいることが実現することができました。

>「ある1フィールドで、一方にしかないデータ」を
> 抽出するものでいいのかどうかがわかっていない状況ですので…
はい、取りあえず望んでいることは一方にしかないデータでOKでした。

もし、ご面倒でなければ、少し勉強のお付き合いをしていただいて良いでしょうか?
・「AまたはBのどちらかだけにあるデータ」を表示させるクエリ
・1つのクエリにまとめて表示
というのが気になりますので。

以下、今回、ご教授いただいて作成したクエリのSQL文を書き込んでおきますので、お時間ございましたら、ご指導下さいませ。
m(_"_)m

<今回のACCESSテーブル構成>
テーブル1:フィールド名“データ1”
テーブル2:フィールド名“データ2”

<ANo.2で教わったクエリのSQL文>
SELECT テーブル1.データ1, テーブル2.データ2
FROM テーブル1 INNER JOIN テーブル2 ON テーブル1.データ1 = テーブル2.データ2
ORDER BY テーブル1.データ1, テーブル2.データ2;

<ANo.4で教わったクエリのSQL文>
※重複データ非表示
SELECT DISTINCT テーブル1.データ1, テーブル2.データ2
FROM テーブル1 INNER JOIN テーブル2 ON テーブル1.データ1 = テーブル2.データ2
ORDER BY テーブル1.データ1, テーブル2.データ2;

※テーブル1:データ1 → テーブル2:データ2
SELECT テーブル1.データ1
FROM テーブル1 LEFT JOIN テーブル2 ON テーブル1.データ1 = テーブル2.データ2
WHERE (((テーブル2.データ2) Is Null))
ORDER BY テーブル1.データ1, テーブル2.データ2;

※テーブル1:データ1 ← テーブル2:データ2
SELECT テーブル2.データ2
FROM テーブル1 RIGHT JOIN テーブル2 ON テーブル1.データ1 = テーブル2.データ2
WHERE (((テーブル1.データ1) Is Null))
ORDER BY テーブル2.データ2, テーブル1.データ1;

補足日時:2006/10/18 11:36
    • good
    • 0

フォローありがとうございます。


No.2さんが書かれたとおりです。

No.1で
>2つのテーブルから必要な項目を含むクエリを作成して
の「必要な項目を含む」というのがそういう意味です。

この回答への補足

ありがとうございます!
できました。
ところで逆のパターン、両方のフィールドを照合して、両方に存在しない(片方にしか存在しない)データを抽出する場合、どのように指定すればよろしいでしょうか?
重ね重ねで、すいませんが、よろしくお願い致します。

補足日時:2006/10/17 10:44
    • good
    • 1

横レス失礼致します。



> 何か他に指定する必要があるでしょうか?

デザインビューで追加したテーブルには、そのテーブルのフィールド(列)名が表示されていると
思いますので、それをすぐ下の領域にドラッグ&ドロップして下さい。
そのフィールドが出力フィールドになります。

ちなみに、各テーブルの一番上にある「*」をドラッグ&ドロップしてやると、全てのフィールドを
一括で出力対象にできます。

この回答への補足

ありがとうございました!
できたようです。
ところで、抽出されたデータにかなり重複データ(同じ値のデータ)が存在します。
重複データは1つだけ表示されるように抽出したいのですが、
どのように、抽出条件?に指定するれば良いでしょうか?
何度もすいません。
よろしくお願いします。

補足日時:2006/10/17 10:40
    • good
    • 1

2つのテーブルから必要な項目を含むクエリを作成して、


比較する共通の項目を結合(リレーション)し、
そのクエリの結果を抽出してやればよいと思います。

この回答への補足

ありがとうございます。
クエリのデザインで2つのテーブルを追加しリレーション(線?)を張って作り、実行してみましたが「クエリには出力フィールドが1つ以上必要です。」というメッセージが出てしまいます。
何か他に指定する必要があるでしょうか?

補足日時:2006/10/16 17:21
    • good
    • 1

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

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A