【Access】2つのクエリを1つにまとめる方法

このQ&Aのポイント
  • テーブルT_Subのmain_idフィールドの最大値のレコードを取得し、T_Mainのidフィールドに存在するもののみを表示するために、2つのクエリを作成しました。
  • 今回は、2つのクエリを1つにまとめる方法を教えていただきたいです。最終的には、Visual Basic上に移植する予定です。
  • また、2つのSQL文がある場合でも、クエリを使用せずに、Visual Basic上の記述のみで動作する方法があれば、それも教えていただきたいです。
回答を見る
  • ベストアンサー

【Access】2つのクエリを1つにまとめる方法

下記のT_Subテーブルでmain_idフィールド毎のdayフィールドの最大値のレコードを取得し、 取得したレコードの中でT_Mainのidフィールドに存在するもののみを表示したいと思い、 下記のQ_T_Sub_SelectクエリとQ_Ansクエリを作成し、 Q_Ansクエリを実行する事で意図した動作になったと思います。 その後、この2つのクエリを1つのクエリにまとめようと思ったのですが、 どのように記述すれば良いか分からなかった為、アドバイスいただける方がいらっしゃいましたら、 ご教示の程よろしくお願いします。 【Q_T_Sub_Selectクエリ】 SELECT T_Sub.* FROM T_Sub WHERE (((T_Sub.id)=(SELECT TOP 1 id FROM T_Sub Q WHERE Q.main_id = T_Sub.main_id ORDER BY day DESC, id DESC ))); 【Q_Ansクエリ】 SELECT T_Main.id, T_Main.field1, Q_T_Sub_Select.id, Q_T_Sub_Select.day, Q_T_Sub_Select.field2 FROM T_Main LEFT JOIN Q_T_Sub_Select ON T_Main.id = Q_T_Sub_Select.main_id; 【Q_Ansクエリの実行結果】 T_Main.id|field1|Q_T_Sub_Select.id|day|field2 1|A|2|     |2000 3|C|6|2011/03/10|200 【テーブル(T_Main)】 id|field1 1|A 3|C 【テーブル(T_Sub)】 id|main_id|day|field2 1|1|     |100 2|1|     |2000 3|2|2011/03/04|400 4|2|2011/03/03|500 5|3|2011/03/10|300 6|3|2011/03/10|200 なお、1つのクエリにまとめたい理由ですが、最終的にはクエリではなく、 Visual Basic上に記述を移植したいと思っているためです。 ちなみに、1つのクエリをVisual Basic上に移植して SQLの実行結果を利用するイメージは何となく分かるため、 2つのクエリを1つにまとめる方法を希望しましたが、 2つのSQL文があってもクエリなどを使用せず、 Visual Basic上への記述のみで動作する方法があれば、そのような方法でも大丈夫です。 以上、よろしくお願いします。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

前回は途中でしたが。 一つにまとめるということであれば、 SELECT T_Main.id, T_Main.field1, Temp.id, Temp.day, Temp.field2 FROM T_Main LEFT JOIN (SELECT T_Sub.* FROM T_Sub WHERE (((T_Sub.id)=(SELECT TOP 1 id FROM T_Sub Q WHERE Q.main_id = T_Sub.main_id ORDER BY day DESC, id DESC )))) AS Temp ON T_Main.id = Temp.main_id;

iroha_168
質問者

お礼

ご回答ありがとうございます。 ご教示いただいたSQLを試したところ、意図した動作となりました。 このたびはどうもありがとうございました。 それと前回は質問内容に漏れがあり申し訳ありませんでした。 以上、よろしくお願いします。

関連するQ&A

  • 【Access】SELECT文の書き方について

    下記の【クエリ(Q_Select)】を実行すると【現在のクエリ実行結果】のようになりますが、これを下記の【希望するクエリ実行結果】のような表示にしたいと思います。 その為、同じT_Sub.main_idがある場合は、最新のT_Sub.dayのフィールド列のみ抽出し、同じT_Sub.main_idで最新のT_Sub.dayが複数あった場合は一番大きいT_Sub.idのフィールド列を抽出しようと思ったのですが、どのように記述すれば良いか分からなかった為、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 【現在のクエリ実行結果】 T_Main.id|field1|T_Sub.id|day|field2 1|A|1|2011/03/01|100 2|A|1|2011/03/02|2000 3|B|2|2011/03/04|400 4|B|2|2011/03/03|500 5|C|3|2011/03/10|300 6|C|3|2011/03/10|200 【希望するクエリ実行結果】 T_Main.id|field1|T_Sub.id|day|field2 2|A|1|2011/03/02|2000 3|B|2|2011/03/04|400 6|C|3|2011/03/10|200 【クエリ(Q_Select)】 SELECT T_Main.id, T_Main.field1, T_Sub.id, T_Sub.day, T_Sub.field2 FROM T_Main INNER JOIN T_Sub ON T_Main.id = T_Sub.main_id; 【テーブル(T_Main)】 id|field1 1|A 2|B 3|C 【テーブル(T_Sub)】 id|main_id|day|field2 1|1|2011/03/01|100 2|1|2011/03/02|2000 3|2|2011/03/04|400 4|2|2011/03/03|500 5|3|2011/03/10|300 6|3|2011/03/10|200 以上、よろしくお願いします。

  • 【Access】クエリをソースに移植する方法

    下記のクエリをフォームのVisual Basicに移植したいと思ったのですが、どのように書けば良いか分からなかった為、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 【クエリ(Q_FORM)】 INSERT INTO W_TBL SELECT T_TBL.* FROM T_TBL WHERE (((T_TBL.key) Like '*' & Forms!F_FORM!txt_key & '*') And ((T_TBL.flag) Like '*' & Forms!F_FORM!txt_flag & '*')); 【テーブル(T_TBL)】 id| key|flag 1|1234|1 2| 12|0 3| 12|1 【テーブル(W_TBL)】 id| key|flag 【フォーム(F_FORM)】 テキストボックス:txt_key テキストボックス:txt_flag コマンドボタン:cmd_insert 【フォームのVisual Basic】 Option Compare Database Option Explicit Private Sub cmd_insert_Click() DoCmd.OpenQuery "Q_FORM" End Sub それと、現在のクエリではtxt_keyが部分一致(txt_keyが12の場合、1234もヒットしてしまいます)すればヒットするようになっていますが、これを完全一致にする方法をご存知の方がいらっしゃいましたら、ご教示の程よろしくお願いします。 単純に完全一致させたいのであれば、txt_key前後のLikeや*を除けば良いのではと思うのですが、txt_keyが未入力の場合は全件ヒットさせたいと思っており、整合性を取る方法が分かりませんでした。 以上、よろしくお願いします。

  • アクセスクエリ メモ型だとエラーになる

    アクセスのテーブル1(主キーなし)に *********************************************************** フィールド1(メモ型) あああ いいい ううう いいい *********************************************************** と言うデータがあるのですが 「あああ」「ううう」は1個で「いいい」は2つあります。 これを、クエリ1で *********************************************************** SELECT テーブル1.フィールド1, Count(テーブル1.フィールド1) AS フィールド1のカウント FROM テーブル1 GROUP BY テーブル1.フィールド1; *********************************************************** と作り、 新しいクエリで *********************************************************** SELECT テーブル1.フィールド1, クエリ1.フィールド1のカウント FROM テーブル1 INNER JOIN クエリ1 ON テーブル1.フィールド1 = クエリ1.フィールド1; *********************************************************** としたいのですが、 メモ型ではダメなのでしょうか? メモ型でフィールドを宣言しつつ、 このようなクエリを作るにはどうすればいいですか? テキスト型にすると問題なくいけます。

  • ユニオンクエリでWHERE句を使うのは不可能でしょうか?

    アクセス2003です。 (select * from Q1) UNION ALL (select * from Q2) UNION ALL (select * from Q3); WHERE (((番号) Like "*001")); としても 「SQLステートメントの後に文字が見つかりました。」 となってしまいます。 「番号」と言うフィールドは Q1、Q2、Q3どのクエリにもあり (select * from Q1) UNION ALL (select * from Q2) UNION ALL (select * from Q3); のみなら正常に動作します。 作成したユニオンクエリで「フィルタの対象」で「*001」と入力したらちゃんと思い通りに動作します。 ユニオンクエリで条件抽出は不可能でしょうか? よろしくお願いします。

  • Accessのクエリの結果で。。。

    Access2000です。 「T_マスタ」 ・ID ・名前 ・会社名 「T_サブ」 ・ID ・年度 ・種類 「T_備考」 ・ID ・年度 ・種類 ・備考 というようなテーブルが3つあります。 これらを検索するために、すべてを入れた「Q_検索」というクエリを作成しました。 リレーションは T_マスタ:ID - T_サブ:ID T_サブ:ID - T_備考:ID T_サブ:年度 - T_備考:年度 T_サブ:種類 - T_備考:種類 となっています。 入力例として 「T_マスタ」 1  山田太朗  ●●株式会社 2  前田前   □□店 3  大坪拳   △△有限会社 「T_サブ」 1  2001  お中元 1  2002  お歳暮 1  2002  お中元 2  2001  お歳暮 2  2002  お中元 3  2001  お歳暮 「T_備考」 1  2001 お中元  お菓子 1  2002 お中元  水菓子 2  2002 お中元  果物 3  2001 お歳暮  ケーキ となっていたとすると、希望では、「Q_検索」クエリの結果が 6件となっていてほしいのに、実際は3件(T_マスタの件数分)しか出てこないのです。 これをすべて反映させるためにはどうしたらいいのでしょうか?

  • Access 2000、ユニオンクエリーがどうしても出来ない!

    初歩の質問ですが、ユニオンクエリーが出来ません。 やりたい事は非常に単純です↓↓ 1:テーブル1、テーブル2、テーブル3があります。 2:各テーブルのデータ内容は様々ですが、共通項目として「品番」を持っています。但しテーブル1は「製品名」、テーブル2と3は「品番」という項目名になっています。 3:各テーブル内に、品番が幾つ入っているか、集計クエリでカウントします。項目名が違うので以下のように処理しました。  <テーブル1の場合>    フィールド|品番のカウント: 製品名|タイトル: "テーブル1"    テーブル |テーブル1     集  計 |カウント  <テーブル2(或いは3)の場合>    フィールド|品番のカウント: 品番|タイトル: "テーブル2"    テーブル |テーブル2     集  計 |カウント 4:3の集計クエリーを繋ぎ、テーブル1~3の品番件数を一気に表示させたい  <ユニオンクエリの内容>     SELECT *     from Q0_カウント_テーブル1     UNION select *     from Q0_カウント_テーブル2     UNION select *     from Q0_カウント_テーブル3; 5:私の予想としてはこんな風↓↓出てくるはずだったのですが・・・     品番のカウント| タイトル     ------------------------------        30   | テーブル1        20   | テーブル2        23   | テーブル3  6:結果は「From句の間違いです」と出ます。他の質問も見ましたが、自分のSQLのどこを直せば良いのかわかりません・・・教えてください!

  • ACCESSクエリエラー

    ACCESSにてクエリをSQLビューにて直書きにて作成したところ、 『メインクエリのFROM句の予約語EXISTS を使用しないフィールドを複数返すサブクエリを 作成しました。サブクエリの SELECT ステートメントを変更し1つのフィールドだけを指定してください』 と、エラー表示がされました。 クエリは INSERT INTO 売上管理TBL VALUES ( SELECT  date() , 商品名称TBL.ID , 商品名称TBL.個数 , 商品名称TBL.単価 * 商品名称TBL.個数 AS 金額 FROM 商品名称TBL WHERE 商品名称TBL.個数 > 0 ); になっています。

  • PHP / MySQL / クエリ実行

    【概要】 PHPからMySQLへのクエリを実行したいのですが、結果が返りません。 【環境】 CentOS5 [PHP5] sakuraインターネット レンタルサーバ スタンダートプランです。 参考:http://www.sakura.ne.jp/rentalserver/matrix.html 【ソース PHP】 ------------------------------------------------------------ $query =  mysql_query(' SET @i := 0; SET @ii := 0; SET @iii := 0; SET @iiii := 0; select `sys_no`,`day`,`counter`,(@iiii := @iiii +1)as `counter2` from (select `sys_no`,`name`,`day`,(@i := @i +1) as `counter` from TBL名 ORDER BY `day` DESC ) as aa where counter BETWEEN (select a.counter from (select `sys_no`,`day`,(@ii := @ii +1) as `counter` from TBL名 ORDER BY day DESC ) as a where sys_no =5) - 1 AND (select a.counter from (select `sys_no`,`day`,(@iii := @iii +1) as `counter` from TBL名 ORDER BY day DESC ) as a where sys_no =5) + 1 '); while ($row = mysql_fetch_array($query)) { 結果取得処理 } ------------------------------------------------------------ ・上記をPHPより実行しますと、「while~」の部分で結果が無いとエラーが返ります。 ・phpMyAdminから直接クエリの部分のみを実行しますと、問題無く結果が返ります。 ・なお、クエリを簡単な一行程度の内容にしますと問題無く実行され、結果が返ります。例:select * from TBL名 ・また、上部にセットしている4つのSETを試しに削除した状態でPHPより実行しますと、結果は返りませんがエラーにはなりません。 以上、アドバイス頂戴できますでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • クエリの遅さの原因

    下記のクエリーをそれぞれ試してみたところ、圧倒的に下の方が遅くなってしまいました。 $rs = mysql_query("select * from A INNER JOIN B ON B.cat = A.id order by B.id desc LIMIT 1, 10 ;",$con); $rs = mysql_query("select * from A INNER JOIN B ON B.cat = A.id where B.name is not null group by B.area order by B.id desc LIMIT 1, 10 ;",$con); where B.name is not null group by B.area この処理はそれほど負荷が掛かってしまうのでしょうか。 他に良い書き方(方法)がありましたら教えてください。

    • ベストアンサー
    • MySQL
  • ExcelVBAでAccessクエリのインポート方法について

    こんばんは。 色々調べたのですが、ExcelVBAでAccessのクエリをだインポートするやり方がわかりません。 ↓下記のやり方でクエリを指定すると、SELECTなどの指定がないといわれます。 http://dqn.sakusakutto.jp/2008/05/vbaaccessexcel_ado.html 下記のやり方で http://www.asahi-net.or.jp/~ef2o-inue/kihon/sub01_05_22.html →『ADOでデータを取得する。』で上手くいきそうなのですが、 テーブルのインポートはできても抽出部分が入れられません。 AccessのSQL文コピーし、strSQL="SELECT"の部分に 貼り付け、""でくくり、""部分は、''に置き換え、最後の;を消しました。 SQL部分にSELECT~としたのですが、1行に収まらず、自動改行がかかってしまい、1行目の最終に"が自動でついてしまい、 HAVING以降のAND((T_受付表.分類2)) In('優','普','')などの抽出条件がエラーになってしまいます。 VBAの通常改行 _も入れてみたのですが、えらーになってしまいます。 『 DAOでフィールドを個々に指定して読み込む』 で再度SQLを指定してやってみたところ、SELECT部分のみにすると、選択条件の入っていない、テーブルのデータインポートは上手くいくのですが、どうしても条件がいれられません。 どうしたらよいのでしょうか。 チラッと探したところ、クエリはインポートできないなどのご意見があったのですが、実際のところどのようにしたら良いのでしょうか。 宜しくお願い致します。

専門家に質問してみよう