- ベストアンサー
アクセスにおける条件付の抽出
お世話になります。教えてください。 以下の3つのテーブルがあります。 1)ベーステーブル 場所 | かな | 種類 -------------------------- 王子 | あ | 水 王子 | い | 紙 仙台 | あ | 紙 青森 | あ | 鳥 青森 | あ | 水 秋田 | い | 鳥 秋田 | あ | 紙 秋田 | い | 水 2)かなテーブル 番号 | かな ------------------- 1 | い 2 | あ 3)種類テーブル 番号 | 種類 ---------------- 1 | 紙 2 | 木 3 | 水 4 | 鳥 で、結果としては 場所 | かな | 種類 -------------------------- 王子 | い | 紙 仙台 | あ | 紙 青森 | あ | 水 秋田 | い | 水 つまり 同じ「場所」で「あ」と「い」があれば「い」を優先して場所を抽出し その中で い>上>木>水>鳥、 あ>上>木>水>鳥 という条件にて 抽出すると上記のような結果になると思いますが、その方法がわかりません。 sqlで書かれても正直わかりませんので、アクセスについているクエリで できないでしょうか? どのようにしても結果が出てきません。 よろしくお願いします。
- みんなの回答 (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)
#1です。 できました? いっぺんにというのは難しいと思いますよ。 でちょっと気になったのは、#2の方への返答で、 >ちなみに上記をsqlにて記述するとどのようにになるのでしょうか? とありましたが、SQLビューはご存知ないですか? クエリーのデザインビューで、クエリーウィンドウのタイトルバーを右クリックしてSQLビュー選べば出てきます。 いろいろ組み合わせてみて、どのようなSQL文になるか見てみると勉強になりますよ。
- Dxak
- ベストアンサー率34% (510/1465)
横から失礼します。 サブクエリを使用すれば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にしてあるところを適当に数値を増やせば、ある程度レコード数が増えても対処可能だと思いますが・・・。 書いている意味、理解可能ですか?
- banker_U
- ベストアンサー率21% (17/78)
とりあえず、思いつくままに書いていくので、もっと効率のいい方法があるかもしれません。 第1段階: (1)ベーステーブルと、かなテーブルをかなで結合 結合プロパティは、ベーステーブルが全レコード。 (2)出力するフィールドは、ベーステーブルの場所とかなテーブルの番号。 (3)グループ化(ツールバーのΣボタン) (4)「番号」フィールドの「集計」欄を「グループ化」から「最小」に変更 (5)このクエリを保存(便宜上クエリ1とします) 第2段階: (1)クエリ1とかなテーブルを番号で結合。(プロパティは両方) (2)クエリ1の「場所」とかなテーブルの「かな」を出力フィールドにする。 (3)このクエリを保存(クエリ2)。 ちなみにこのクエリを実行すると以下のテーブルが得られるはずです。 場所 | かな -------------- 王子 | い 仙台 | あ 青森 | あ 秋田 | い 第3段階: (1)ベーステーブルとクエリ2を、場所とかなで結合(両方) (2)ベーステーブルの全フィールドを出力フィールドにする。 あとは同じようなことをかなテーブルを種類テーブルにおきかえてもう一回繰り返すだけなので、できると思いますが、わからなければまた質問してください。
お礼
早速のご回答ありがとうございます。 やはり数回に分けてやらなければならないのですかね。 とりあえずやってみます。 ありがとうございます。
お礼
ありがとうございます。 えーと、sqlについてはまったくわからないというほどではありません。(笑) ただサブクエリって使ったことないので・・・ ちなみに上記をsqlにて記述するとどのようにになるのでしょうか? チャレンジしてみたいので教えていただけますか? おっしゃっている意味は少しは理解できてると思います。