テーブルA、B、Cがあります。テーブルAには10万件のデータ。テーブルBは1万件。テーブルCは5万件のデータがあるとします。各テーブルにはIDというフィールドがあり、このIDで3つのテーブルを結合することが可能です。やりたいことは、クエリを作りたいです。


・条件はテーブルAを基にする。
・まずテーブルBにあるIDは除外する。つまりA-Bを行う。
・かつテーブルAのIDはテーブルCに存在しないといけない。

といたSQLをaccess 2003のクエリで作成したいのですが、作成方法をお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:2010/01/11 16:41:23
  • 終了:2010/01/18 16:45:02

回答(2件)

id:vegah No.1

vegah回答回数496ベストアンサー獲得回数22010/01/11 17:39:12

ポイント35pt

ご指定の条件を元にACCESSでクエリーを作成し、SQL表示にしたものです。

SELECT A.*

FROM (A LEFT JOIN B ON A.ID = B.ID) LEFT JOIN C ON A.ID = C.ID

WHERE (((B.ID) Is Null) AND (Not (C.ID) Is Null));

テーブルAとB,CをIDで結合し、テーブルBではNULLに、テーブルCではNot Nullになるような条件で抽出しました。

id:akaired

解説頂けると幸いです。なぜこれで条件が満たされるのでしょうか?私の頭が理解できないので、わかりやすく分解して説明頂けると嬉しいです。

2010/01/11 21:44:51
id:t-wata No.2

t-wata回答回数82ベストアンサー獲得回数132010/01/12 02:44:24

ポイント35pt

vegahさんの補足です。(コメントだと表を使えないので解答欄に書かせてもらいます)

テーブルA

ID VALUE
1 xxx
2 yyy
3 zzz

テーブルB

ID VALUE
1 aaa

テーブルC

ID VALUE
1 qqq
2 www

とすると、A LEFT JOIN B ON A.ID = B.IDは

A.ID A.VALUE B.ID B.VALUE
1 xxx 1 aaa
2 yyy null null
3 zzz null null

(A LEFT JOIN B ON A.ID = B.ID) LEFT JOIN C ON A.ID = C.IDは、

A.ID A.VALUE B.ID B.VALUE C.ID C.VALUE
1 xxx 1 aaa 1 qqq
2 yyy null null 2 www
3 zzz null null null null

となります。なので、B.IDがnullならテーブルBにIDが無いことになり、C.IDがnullじゃないなら、AにもCにも同じIDが存在しているということになります。

それらの共通部分が求めるものなので、(((B.ID) Is Null) AND (Not (C.ID) Is Null))で上の結合した表を絞り込めばよいことになります。

  • id:taknt
    select テーブルA.* from テーブルA,テーブルB,テーブルC
    where
    not (テーブルA.ID = テーブルB.ID) and
    テーブルA.ID = テーブルC.ID

    みたいなことを やればOK
  • id:akaired
    takntさん
    ご回答ありがとうございます!!
  • id:taknt
    質問から判断すると
    テーブルCには テーブルBにあるIDが含まれていてもいいんですよね?
  • id:frkw2004
    左外部結合させると(Left Join) 、左のテーブル(主となるテーブル)に存在し、右のテーブル(属となるテーブル)には存在しないレコードが含まれます。そういったレコードの場合、右のテーブル由来のフィールドにはNullが格納されます。

    ですので、Aに対しBをLeft Join させると、B.ID がNULLのレコードはBに存在していないレコードになります。B.IDに値が入っている場合は、Bにレコードが存在しています。

    今回のケースぐらいの件数なら差はないでしょうけど、Cのほうが件数が少ないので、Cを主体にレコードを取得するほうが効率がいいです。(10万件の検索ではなく、5万件の検索で済む)もしAが100万件でCが5万件とかならCを主体にして
    Select A.* FROM C Left Join A On C.ID=A.ID
    Left Join B On B.ID=A.ID
    Where B.ID Is NULL
    にすると早くなるでしょう。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません