ACCESS 2003を使用しています。

テーブルA
テーブルB
の2テーブルでクエリを作っています。

結合的には・・・
テーブルAのフィールドX ⇔ テーブルBのフィールドY
です。
これで2テーブルに共通する一致データのみ抽出はできるのですが、
2テーブルに共通する一致データに加えて、
2テーブルの不一致データも一緒にクエリ表示されるようにしたいのです。

欲しいのは抽出イメージは、以下のような感じのクエリ結果です。

テーブルA:フィールドX|テーブルBのフィールドY
a             |(空)
(空)           |b
c             |c
d             |(空)
(空)           |e
f              |f 
g             |(空)
h             |h

おそらく、SQL文を書く必要があるとは、想像できるのですが・・・
どなたか、ご教授いただけると助かります。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

SQL文のみで組もうとしたら、私自身がちょっと混乱してしまったので(汗)、


「SQL+クエリ」の組み合わせの形で回答させて戴きます。
なお、No.1の方の回答と同様、更新はできません。
(更新が必要な場合は、画像添付したクエリをテーブル作成クエリか
 追加クエリにして、「ワークテーブルで編集&更新ボタンで反映」
 といった機構が必要になります)


まず、新規クエリのSQLビューに、以下のSQL文を貼り付けて、
名前を「SQ1」として保存してください。
内容は、「テーブルAのフィールドX、及びテーブルBのフィールドYに
あるデータの非重複の一覧」になります:

Select フィールドX As Idx From テーブルA
Union Select フィールドY As Idx From テーブルB;


次に、この「SQ1」クエリと、テーブルA、テーブルBを使用し、添付
画像のようなクエリを作成してください。
(こちらのクエリ名は何でもOkです)

念のため、SQL文も貼り付けておきます:
SELECT テーブルA.フィールドX, テーブルB.フィールドY FROM
(SQ1 LEFT JOIN テーブルA ON SQ1.Idx = テーブルA.フィールドX)
LEFT JOIN テーブルB ON SQ1.Idx = テーブルB.フィールドY
ORDER BY SQ1.Idx;

※「SQ1」に作成した「Idx」フィールドは、非表示のまま、並べ替えに
  使用することで、ご質問文の通りの並べ順にしています。
「ACCESSクエリでの結合の仕方・・・S」の回答画像2
    • good
    • 0
この回答へのお礼

はい、抽出だけですので、内容の更新はなくて大丈夫です。
なんと、「SQL+クエリ」という手法ができるんですね。
考えてみればできることがわかるのですが、これはちょっと気がつきませんでした。
今回は、この手法でやってみたいと思います。
ご丁寧に挿絵までいただき、大変よく理解することができました!
勉強にもなりました!
本当にどうもありがとうございました。

お礼日時:2009/05/28 16:07

内部結合、外部結合、左外部結合などの言葉がある。


それをエクセルの解説書かWEBで勉強し、質問はどれに当たるか勉強してから、質問すべきだ。
http://www.geocities.jp/kotopara_g/oshiete01/a_k …
など。
SQLはクエリをデザインビューで正しく組み立てれば、SQLビューで見るとどうなるか判る。2の次だ。
>SQL文を書く必要があるとは、想像できるのですが・
生半可な知識で先走りすぎ。SQLから書く人やVBA+SQLでやる(出来る)人ももちろん居るがまだそのレベルではなさそうだ。
ACCESSのGUIのよさを利用すべきだ。
    • good
    • 0
この回答へのお礼

恐れ入ります。
EXCELであれば、VBA+SQLで既にガンガンに組んでいて、DB抽出も更新も慣れています。
ACCESSでも、よくクエリは使っていますが、ユニオンクエリ方面が、あまり使ったことがないもので。

勉強します!

お礼日時:2009/05/28 16:05

X  Y


   b
   e
a
c   c
d
f   f
g
h   h

表示順はXになってしましますが、以下のクエリでできると思います。
(更新はできません)

SELECT テーブルA.X, テーブルB.Y
FROM テーブルA LEFT JOIN テーブルB ON テーブルA.X = テーブルB.Y
UNION
SELECT テーブルA.X, テーブルB.Y
FROM テーブルA RIGHT JOIN テーブルB ON テーブルA.X = テーブルB.Y;
    • good
    • 0
この回答へのお礼

ご回答どうもありがとうございます。
こちらも試してみたいと思います。
やはりユニオンクエリが必要なのですね・・
アクセスのGUIだけで、SQLを書かなくても、こういったことができるようになると楽チンなのですが・・・でもそれでは勉強になりませんね(苦笑
とにかく、ユニオンクエリに頭をひねっている時間がなかったので、助かりました。
ありがとうございました!

お礼日時:2009/05/28 16:10

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QACCESS クエリのデザインビューを開かせたくない。

管理者以外がクエリをデザインビューで開けないように設定したいのですが、セキュリティーの設定では、「構造の読み取り」にチェックを入れる必要があるので、クエリの抽出条件等が参照されてしまいます。(フォームを単票形式にしており、開いているフォームのページのID番号をクエリの抽出条件とし、レポートにその番号の内容のものだけが反映されるよう設定しています。また自分が作った関数の式を見られたくないのです。)クエリの条件がきちんとレポートに反映し、なおかつクエリをデザインビューで見れなくする方法はありますか。(「隠しオブジェクト」にするのは、なしです。ただ、隠しオブジェクトにしてもユーザーは「隠しオブジェクト」の設定ができないのであればありです。)
 プログラムを組むしかないのでしょうか?そうであればどんな感じで組めばいいのか教えてください。

Aベストアンサー

> クエリの条件がきちんとレポートに反映し、

クエリとして保存せずに、レポートのレコードソースでSQL文を使ってやるとか。

レコードソースプロパティで右側の ... をクリックすれば、クエリビルダが
起動しますので。

Qアクセスで複数テーブルをひとつにする方法 以下3つのテーブルがあります。 Aテーブル Bテーブル C

アクセスで複数テーブルをひとつにする方法

以下3つのテーブルがあります。
Aテーブル
Bテーブル
Cテーブル
共にフィールド数、フィールド名は共通です。
3つのテーブルのレコードをまとめてDテーブルを作る場合はどのように操作するのでしょうか?

Aベストアンサー

「ユニオンクエリ」について調べてください。

Qアクセスのクエリのデザインビュー

表記の件で質問させてください。
デザインビューの抽出条件でIsNullやnotNull
を指定するにはどのようにしたらいいのでしょうか?
よろしくお願いします。
項目タイプは数値型です。

Aベストアンサー

スペースが抜けています

Is Null

Not Is Null

Null <>Null
と入力しても上のように書き変えてくれますよ

QAccessで BテーブルのフィールドをAフールドに書き換えたい。

初心者ですが宜しくお願い致します。

Aテーブル →[氏名],[名前]
Bテーブル →[氏名],[結婚後氏名]

(1)上のようなテーブルがあります。クエリで、AテーブルとBテーブルの[氏名]フィールドをキーにしてリレーションを組み、A,Bテーブルのフィールド全てを表示させます。

(2)(1)で抽出されたデータだけ、Aテーブルの[氏名]フィールドをBテーブルの[結婚後氏名]フィールドに書き換えたいのですが・・・・

なにかよい方法はありますでしょうか。
詳しい方、教えてください。
宜しくお願い致します。

Aベストアンサー

更新クエリでできますよ。
(1)で作ったクエリの種類を変更します。
(クエリのデザインビューで「クエリ」→「更新」)
同じくデザインビューにて
フィールド「氏名」の下の「レコードの更新」のとこに[結婚後氏名]を書き込んで実行すれば、○○件のレコードを更新しますって聞いてきますので、「はい」をクリックすればOK

QACCESS2003のクエリのデザインビューの抽出条件について

現在ACCESS2003上で、テーブルとテーブルを結合させて、日時を抽出条件にして表示させるレコードを限定しています。

そこで
発生日時≦対処日時≦回復日時
という抽出条件を
[テーブル1]![対処日時] >=[テーブル2]![発生日時] And [テーブル1]![対処日時]<=[テーブル2]![回復日時]
と記載しています。

ここまでは良いのですが
次に
発生日時-1時間≦対処日時≦回復日時+1時間
という風に抽出条件の範囲を時間で広げてやりたい場合はどのようにすればよいでしょうか

一度、日時をシリアル値に変換するという処理が必要になってくるのでしょうか。
日時のフォーマットは
yyyy/mm/dd hh:mm:ssです。

わかりましたら、ご回答よろしくお願いいたします。

Aベストアンサー

DateAdd関数を調べると分かりますよ

QAccess テーブルAにテーブルBのデータを追加

Accessで、テーブルAにテーブルBのデータ(全部)を追加したいです。
初歩的な質問でスミマセン。

Aベストアンサー

簡単にやるにはテーブルBのクエリをクエリウィザードで作り そのクエリをテーブル追加クエリにすれば簡単にできます。
クエリウィザードで作ったテーブルBのクエリをデザインビューで開きメニューのクエリにある追加を選ぶかデザインビュー上で右クリックでクエリの種類から追加を選びます。
追加を選ぶとテーブルを選択できますのでそこでテーブルAを選びます。テーブルBとテーブルAのフィールド名が同じならレコードの追加欄にフィールド名が自動で表示されます。フィールド名が異なる場合はレコードの追加欄をクリックしてテーブルAの追加先のフィールド名をそこで指定します。
クエリを保存します。
保存したクエリをダブルクリックすればテーブルBのレコードがテーブルAに全部追加されます。

Qリレーションシップがたくさんついているクエリ同士だと、不一致クエリを作

リレーションシップがたくさんついているクエリ同士だと、不一致クエリを作成することはできないのでしょうか?

不一致クエリにしたい二つのクエリのみ別のフォームで作成し直して、不一致クエリを作成すると、抽出してくれたのですが、もともとのリレーションシップがついているクエリのままだと抽出が0になってしまいます。

フィールドやデザインは全く同じなのですが、やはりリレーションシップのせいでしょうか?

Aベストアンサー

【要旨】
クエリの結合線は、『結合先のテーブルのデータを検索条件として
扱う』という働きを持ちます。
リレーションシップによって自動で追加された結合線が不要(無用)
な場合は、クエリのデザインビューから削除する必要があります。

※リレーションシップは削除せず、クエリ毎に結合を編集します※


【詳細】

> リレーションシップがたくさんついているクエリ同士だと、
> 不一致クエリを作成することはできないのでしょうか?

『リレーションシップ』が「直接」レコードの抽出件数を左右する
ことはありません。

ただ、クエリのデザインビューで、リレーションシップが設定
されたテーブル同士を追加した場合等には、それに対応した
『結合線』も自動的に追加されます。

リレーションシップと結合の違いについて(回答No.2):
http://oshiete.goo.ne.jp/qa/5073445.html

この、『クエリのデザインビューでの、テーブルの結合』は、
「複数の検索条件を指定した抽出」としての意味を持つため、
リレーションシップの設定が、結果として(間接的に)、
抽出件数を左右する、ということはあります。
http://oshiete.goo.ne.jp/qa/5683407.html

従って、クエリで実際に行いたい抽出の内容によっては、
リレーションシップの設定を元に自動的に追加された結合を
削除したり、結合の種類を変更したり、といった操作も必要に
なります。

操作方法は、それぞれ以下の通りです:

<結合線の削除>
a)結合線をクリックして太線表示になった状態で、キーボードの
 Deleteキーを押す
b)結合線を右クリックして表示されるメニューから「削除(D)」を
 選択

<結合線の変更>
 結合線をダブルクリックするか、それを右クリックして表示
 されるメニューから「結合プロパティ(J)」を選択すると開く
 『結合プロパティ』ダイアログで、目的に合った項目を選択


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

【要旨】
クエリの結合線は、『結合先のテーブルのデータを検索条件として
扱う』という働きを持ちます。
リレーションシップによって自動で追加された結合線が不要(無用)
な場合は、クエリのデザインビューから削除する必要があります。

※リレーションシップは削除せず、クエリ毎に結合を編集します※


【詳細】

> リレーションシップがたくさんついているクエリ同士だと、
> 不一致クエリを作成することはできないのでしょうか?

『リレーションシップ』が「直接」レコードの抽出件数を左右する
ことはありま...続きを読む

QAccess]2つのテーブルを比較してフィールドの一部が一致したデータを抽出

2つの名簿テーブルを比較してどちらのテーブルにも含まれている個人を抽出したいと考えております。

テーブル名とフィールドは以下のとおりです。

====================
テーブル名「名簿A」

氏名
電話番号
住所
メールアドレス
====================
テーブル名「名簿B」



電話番号
住所
メールアドレス
====================

たとえば、この2つの名簿をメールアドレスで一致したものを抽出する場合は選択クエリのデザインビューで「名簿A」のフィールドを読み込ませ、
メールアドレスフィールドの抽出条件として

Like [名簿B].[メールアドレス]

を入れれば抽出ができたのですが、メールアドレスは、名簿ごとに記入されていたりしなかったりするので、名前での一致を行いたいと思っています。

ここで問題なのが、名簿Aは「氏名」で入力されているのに対し、名簿Bでは「姓」と「名」が別フィールドになっております。

そこで自分なりにやってみたのが、選択クエリのデザインビューで「氏名」のフィールドの抽出条件として

Like (*[名簿B].[姓]*)

を設定するものでした。
これがうまくいけば最終的には

Like (*[名簿B].[姓]*) And Like (*[名簿B].[名]*)

という風にして、名簿Aの「氏名」フィールドに名簿Bの「姓」も「名」も入っているものを抽出できるかな?と考えたのですが、上記のように入力すると、自動的に

Like ("*[名簿B].[姓]*")

となってしまい、何も抽出されなくなってしまいました。

このような方法では希望する抽出は行えないのでしょうか?

お分かりのかた、よろしくお願いいたします。

2つの名簿テーブルを比較してどちらのテーブルにも含まれている個人を抽出したいと考えております。

テーブル名とフィールドは以下のとおりです。

====================
テーブル名「名簿A」

氏名
電話番号
住所
メールアドレス
====================
テーブル名「名簿B」



電話番号
住所
メールアドレス
====================

たとえば、この2つの名簿をメールアドレスで一致したものを抽出する場合は選択クエリのデザインビューで「名簿A」のフィールドを読み込ませ、
メール...続きを読む

Aベストアンサー

> 名簿Aの「氏名」欄には姓と名の間にスペースが入っているものがあり

[名簿B].[姓] & [名簿B].[名]を使った時のクエリで考えてみます。

クエリをSQLビューで表示した時、抽出条件のところは

[名簿A].[名前] Like [名簿B].[姓] & [名簿B].[名]
とか
[名簿A].[名前] = [名簿B].[姓] & [名簿B].[名]

になっていると思います。

[名簿A].[名前]の部分に細工して、Replace([名簿A].[名前]," ","")に書き換えます。
(Replace で空白を削除してあげます)

それをもとに
Replace([名簿A].[名前]," ","") = [名簿B].[姓] & [名簿B].[名]
としてみるとどうなりますか。


※バージョンによっては、クエリ内で Replace が使えないものがあったかと思います。
その時には、補足なりに記述してください。
(対処方法はあります)

QACCESS2007のクエリについて

ACCESS2007のクエリについて

ACCESS初心者です。
よろしくお願いします。

クエリを作成するときに、デザインビューでフィールドの位置を変更したり、
(たとえば、「氏名」の列を4列目から2列目に移動する)
並べ替えなどをして、データシートビューにすると反映されているのに、
データシートビューでフィールドの位置を変更したり、並べ替えなどをしても、
デザインビューには反映されてませんが、
クエリとはこういうものなのですか?

Aベストアンサー

デザインで設定を元にデータシートビューを(毎度)作ってます。
クエリデザインビューで設定を定義する、
その実行結果を見るのが(クエリの)データシートビュー、
そういう使い方です。
テーブルのデザインビュー、データシートビューも同じ感覚と
みていいでしょう。

デザイン上でも変更できて、データシートビュー上でも変更できたら
何が正しい状態かわからなくなってしまいます。

クエリデザインビューで設定したらデータシートビューで確認、
追加修正あったらクエリデザインビューで修正しまたデータシートビューで確認、
この繰り返しです。
必要に応じて保存。

Q選択クエリを基に不一致クエリを作成したけれど...

識者の力をお借りしたく質問いたします。

質問ページから不一致クエリに関する内容を参考に、ある不一致クエリを作成しています。

しかし、出来るはずの方法で結果が正しく表示されず途方にくれています。

処理の内容としては、あるクエリのフィールドを参考に不一致クエリで差分レコードを抽出したいというものです。

通常不一致クエリはテーブルの主キーを基に作成するものと私は理解しているのですが、今回の処理では基のテーブルに主キーが無く、(作成できない事情があり)クエリで無理矢理主キーもどきのものを作りました。

クエリで作成したのは、数字6桁(最大で)の後ろにチェックディジットとしてアルファベット1文字を追加した計7文字のフィールドです。

例:131401A

不一致を抽出したい基となる2つのテーブルに対しこのクエリを作成しました。

この2つのクエリから不一致クエリで差分を抽出し、基のテーブルに追加クエリで追加したいのですが、どうやっても不一致項目が表示されません。

根本的にクエリからの不一致クエリは作成できないのでしょうか?

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

■状況
テーブル1/テーブル2(基となるテーブル、主キー無し)
クエリ1/クエリ2(テーブル1/テーブル2のレコードにコードを追加するクエリ)
コード1/コード2(クエリ1/クエリ2で作成したコード)例:131401A
不一致クエリ
テーブル2 → テーブル1 (リレーションシップ)
コード2 条件:Not Null

※テーブル2の方が最新レコードが入っているので、テーブル2の差分レコードをテーブル1に追加したいというのが基本的な内容です。

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

識者の力をお借りしたく質問いたします。

質問ページから不一致クエリに関する内容を参考に、ある不一致クエリを作成しています。

しかし、出来るはずの方法で結果が正しく表示されず途方にくれています。

処理の内容としては、あるクエリのフィールドを参考に不一致クエリで差分レコードを抽出したいというものです。

通常不一致クエリはテーブルの主キーを基に作成するものと私は理解しているのですが、今回の処理では基のテーブルに主キーが無く、(作成できない事情があり)クエリで無理矢理主キー...続きを読む

Aベストアンサー

比較に使用する列にキー(インデックス)があれば良く、主キーである必要はありません。

また、不一致クエリの部分に誤解があるようですね。
テーブルを簡略化して例示します。

テーブル1/テーブル2
1   / 1
2   / 2
    / 3   ←これが検出されるクエリを作成する。

この場合、不一致クエリではテーブル1の側がNULLになります。テーブル2がNotNullでは1~3まですべて検出されてしまいます。

作成は以下の順序で行ってみてください。
1)テーブル1とテーブル2を追加して選択クエリを作成します。
  テーブル2のすべてとテーブル1の結合列を表示させるようにします。
2)テーブル2の結合列をテーブル1の結合列にドラッグします。
3)結合で表示された線をクリックしてテーブル2のすべてが表示されるようにします。
4)ここで確認。例示の3行が表示されます。
5)追加分のみに絞ります。1)で作成したテーブル1の結合列の条件にIsNullを加えてください。
6)ここで確認。例示の3行目だけが表示されます。
7)5)でIsNullを設定した列の「表示」のレ点を外します。
8)ここで確認。例示の3行目のテーブル2の部分だけが表示されます。
9)デザインビューにしてメニューのクエリをクリックし、「追加」を選択します。対象は追加なさりたいテーブル(テーブル1?)を選択。

以上でいかがでしょうか?

比較に使用する列にキー(インデックス)があれば良く、主キーである必要はありません。

また、不一致クエリの部分に誤解があるようですね。
テーブルを簡略化して例示します。

テーブル1/テーブル2
1   / 1
2   / 2
    / 3   ←これが検出されるクエリを作成する。

この場合、不一致クエリではテーブル1の側がNULLになります。テーブル2がNotNullでは1~3まですべて検出されてしまいます。

作成は以下の順序で行ってみてください。
1)テーブル1とテーブル2を追...続きを読む


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

人気Q&Aランキング

おすすめ情報