• ベストアンサー

アクセスにおける条件付の抽出

お世話になります。教えてください。 以下の3つのテーブルがあります。 1)ベーステーブル 場所 | かな | 種類 -------------------------- 王子 | あ  | 水 王子 | い  | 紙 仙台 | あ  | 紙 青森 | あ  | 鳥 青森 | あ  | 水 秋田 | い  | 鳥 秋田 | あ  | 紙 秋田 | い  | 水 2)かなテーブル 番号 | かな ------------------- 1  | い 2  | あ 3)種類テーブル 番号 | 種類 ---------------- 1  | 紙 2  | 木 3  | 水 4  | 鳥 で、結果としては 場所 | かな | 種類 -------------------------- 王子 | い  | 紙 仙台 | あ  | 紙 青森 | あ  | 水 秋田 | い  | 水 つまり 同じ「場所」で「あ」と「い」があれば「い」を優先して場所を抽出し その中で い>上>木>水>鳥、 あ>上>木>水>鳥  という条件にて 抽出すると上記のような結果になると思いますが、その方法がわかりません。 sqlで書かれても正直わかりませんので、アクセスについているクエリで できないでしょうか? どのようにしても結果が出てきません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.4

> ちなみに上記をsqlにて記述するとどのようにになる > のでしょうか? 場所 |優先 |番1 | かな |番2 | 種類 ------------------------------------------------- 王子 |23 |2  | あ  |3  | 水 王子 |11 |1  | い  |1  | 紙 仙台 |21 |2  | あ  |1  | 紙 青森 |24 |2  | あ  |4  | 鳥 青森 |23 |2  | あ  |3  | 水 秋田 |14 |1  | い  |4  | 鳥 秋田 |21 |2  | あ  |1  | 紙 秋田 |13 |1  | い  |3  | 水 これは、サブクエリを使用しているわけではなく通常のデザインビューで作成できます。 SQL文では、 SELECT ベーステーブル.*, [かなテーブル]![番号]*10+[種類テーブル]![番号] AS 優先, かなテーブル.番号 AS 番1, 種類テーブル.番号 AS 番2 FROM (ベーステーブル INNER JOIN かなテーブル ON ベーステーブル.かな = かなテーブル.かな) INNER JOIN 種類テーブル ON ベーステーブル.種類 = 種類テーブル.種類; で、作成できます。 理解しやすいかなと、余分な処理は入れてあります。 サブクエリで1つで出てくるようにすると、 SELECT ベーステーブル.* FROM (ベーステーブル INNER JOIN かなテーブル ON ベーステーブル.かな = かなテーブル.かな) INNER JOIN 種類テーブル ON ベーステーブル.種類 = 種類テーブル.種類 WHERE (かなテーブル!番号*10+種類テーブル!番号) =(SELECT Min(Subかなテーブル!番号*10+Sub種類テーブル!番号) AS 優先 FROM (ベーステーブル AS Subベーステーブル INNER JOIN かなテーブル AS Subかなテーブル ON Subベーステーブル.かな = Subかなテーブル.かな) INNER JOIN 種類テーブル AS Sub種類テーブル ON Subベーステーブル.種類 = Sub種類テーブル.種類 GROUP BY Subベーステーブル.場所 HAVING (Subベーステーブル.場所= [ベーステーブル]![場所] ) ))); で、1つサブクエリを条件に書いた場合の例です。 他にも方法がありますけど、思いつくSQL文でこれを含めて3通りかな? 追伸 私も、いきなりSQL文を打ち込んでいるわけではなく、デザインビューで作成、SQLビューでコピー&ペーストで貼り付けて作成仕上げてます。 多重にクエリーを動作させているものは、最終的にはサブクエリを使用すれば、どれも1クエリに変更は可能ですが、編集しなおす時(仕様変更時)に大変になりますので多重のまま、使用された方が訂正は簡単です。

その他の回答 (3)

  • banker_U
  • ベストアンサー率21% (17/78)
回答No.3

#1です。 できました? いっぺんにというのは難しいと思いますよ。 でちょっと気になったのは、#2の方への返答で、 >ちなみに上記をsqlにて記述するとどのようにになるのでしょうか? とありましたが、SQLビューはご存知ないですか? クエリーのデザインビューで、クエリーウィンドウのタイトルバーを右クリックしてSQLビュー選べば出てきます。 いろいろ組み合わせてみて、どのようなSQL文になるか見てみると勉強になりますよ。

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.2

横から失礼します。 サブクエリを使用すれば1つで出来そうですが、SQL文が理解できないと言うことで、段階を追っているのだと思うのですが・・・。 私の方も、とりあえずの解決例^^; 場所 |優先 |番1 | かな |番2 | 種類 ------------------------------------------------- 王子 |23 |2  | あ  |3  | 水 王子 |11 |1  | い  |1  | 紙 仙台 |21 |2  | あ  |1  | 紙 青森 |24 |2  | あ  |4  | 鳥 青森 |23 |2  | あ  |3  | 水 秋田 |14 |1  | い  |4  | 鳥 秋田 |21 |2  | あ  |1  | 紙 秋田 |13 |1  | い  |3  | 水 優先:[かな].[番号]*10+[種類].[番号] 番1:[かな].[番号] 番2:[種類].[番号] と言うクエリを作成し、優先の最小値を取得、表示のし直しで出来ると思います。 で、10にしてあるところを適当に数値を増やせば、ある程度レコード数が増えても対処可能だと思いますが・・・。 書いている意味、理解可能ですか?

yhg
質問者

お礼

ありがとうございます。 えーと、sqlについてはまったくわからないというほどではありません。(笑) ただサブクエリって使ったことないので・・・ ちなみに上記をsqlにて記述するとどのようにになるのでしょうか? チャレンジしてみたいので教えていただけますか? おっしゃっている意味は少しは理解できてると思います。

  • banker_U
  • ベストアンサー率21% (17/78)
回答No.1

とりあえず、思いつくままに書いていくので、もっと効率のいい方法があるかもしれません。 第1段階: (1)ベーステーブルと、かなテーブルをかなで結合 結合プロパティは、ベーステーブルが全レコード。 (2)出力するフィールドは、ベーステーブルの場所とかなテーブルの番号。 (3)グループ化(ツールバーのΣボタン) (4)「番号」フィールドの「集計」欄を「グループ化」から「最小」に変更 (5)このクエリを保存(便宜上クエリ1とします) 第2段階: (1)クエリ1とかなテーブルを番号で結合。(プロパティは両方) (2)クエリ1の「場所」とかなテーブルの「かな」を出力フィールドにする。 (3)このクエリを保存(クエリ2)。 ちなみにこのクエリを実行すると以下のテーブルが得られるはずです。 場所 | かな -------------- 王子 | い   仙台 | あ  青森 | あ  秋田 | い  第3段階: (1)ベーステーブルとクエリ2を、場所とかなで結合(両方) (2)ベーステーブルの全フィールドを出力フィールドにする。 あとは同じようなことをかなテーブルを種類テーブルにおきかえてもう一回繰り返すだけなので、できると思いますが、わからなければまた質問してください。

yhg
質問者

お礼

早速のご回答ありがとうございます。 やはり数回に分けてやらなければならないのですかね。 とりあえずやってみます。 ありがとうございます。

関連するQ&A