• ベストアンサー

アクセスで複数のクエリを使ったデータ抽出

一つのテーブルがあり、そこから削除したいレコードを複数の条件でそれぞれクエリを作成します。3つクエリができたとして、 元データ-(クエリ1)-(クエリ2)-(クエリ3)=抽出データ としたいのですが、これを一度のアクションで行うことはできるでしょうか?

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

  • ベストアンサー
  • fly_moon
  • ベストアンサー率20% (213/1046)
回答No.6

何度も失礼します。余計なお世話かもしれませんが。 クエリを選択制にしたいということですが、クエリからクエリを作成している以上、選択制には出来ないのではないですか? 例えばテーブル1からIDが10以上のデータを抽出してクエリ1を作成してそれを基にふり仮名が「ア」で始まるデータを抽出してクエリ2を作成し、それを基に住所が東京都のデータを抽出したクエリ3を作成したとします。でもある時、東京都在住の人全員のデータが欲しくなったとします。その場合、クエリ3の条件だけ選択したいと言っても、クエリ2を基に作っているので、クエリ3を利用することは出来ず、もう一つテーブル1を基にクエリ3と同じ抽出条件のクエリ4というクエリを作成する必要があります。なので、20個のクエリの組み合わせによって変化させるのなら、ものすごい数のクエリが必要になります。UNIONクエリもクエリからクエリを作成されている以上、うまくいかないと思いますよ。 20個のクエリにそれぞれ10個の条件があった場合、200の条件で抽出することになります。どういう状況かわかりませんが、本当にそれだけの条件を作ったクエリが必要ですか?パラメーターなどで、抽出条件を入力できるように作ったほうが良くはないですか?

noname#41715
質問者

補足

ご意見ありがとうございます。 クエリは、抽出条件用のデータを作成する為にひとつ、それを元に抽出したデータがひとつ。のシンプルなものです。2重3重となっているわけではありません。この抽出条件用のクエリにかなりややこしい条件をつけていますので、条件欄の文字数オーバーとかになるほどです。単純にテキストを検索して抽出というのではなく、計算式等を入れた新しいフィールドに対してさらに複雑な条件をかける・・・というような感じです。 私がイメージしていたのはフォームにてチェックボックスをクエリ分作り、チェックが入ったクエリのみデータを抽出し、元テーブルから除外し、残りのデータを表示する。これをボタンひとつで。が希望でした。 ユニオンクエリは画期的だなぁと思ったのですが、一度データを作って終わり、ではなく毎回元データは変化しますのでやはりクエリを選択制にするってところで難しいかなぁと・・・。 中途半端な知識で余計ややこしくさせてしまいすみません。。。

その他の回答 (5)

  • fly_moon
  • ベストアンサー率20% (213/1046)
回答No.5

削除は関係ないですよね。元データから選択クエリで抽出したいだけで元データを消したいわけではないですよね。削除クエリを実行("DELETE FROM~" )すると元データのテーブルからデータが消えてしまいますよ。誤解を招くので削除という言葉は使わないほうが良いでしょう。 >私が出来なかっただけかもしれませんが 多分そうだと思われます。そちらの方を質問されてクエリを書き直されたほうが良いと思います。クエリを複数かませると処理速度が低下したりします。これからも色々お作りになると思いますので、そういうものをどんどん増やし、つじつまを合わせるやり方を考えるより、正しい作り方を覚えられてスマートな形の物に作り直された方が宜しいかと思います。 クエリを書き直せば、特にVBAを使用する必要もないように思われます。コマンドボタン押下でクエリを開くようにマクロを組めば良いだけです。

noname#41715
質問者

お礼

ご意見ありがとうございます。 クエリを分けている理由は、そのクエリを選択制にしたいということもあり、わかりやすいように個別にしていました。 実際にはクエリは20個あるんです。これを一つにまとめるのは至難の業ではないかと…演算フィールドも沢山あるので、何十列となり、ちょっとこんがらがってしまいそうです。。。 ありがとうございました。

  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.4

抽出のみなら、UNION で結合出来ると思いますよ。 <参考> http://makotowatana.ld.infoseek.co.jp/access/achowCombineDataInFieldsTwoMoreTablesUnionQueryS.htm

noname#41715
質問者

お礼

こんなやり方があったんですねっ。さっそくやってみます!ありがとうございます。

noname#140971
noname#140971
回答No.3

訂正: DoCmd.OpenTable "仕入記録" クエリを作らなくても良かったです。

noname#140971
noname#140971
回答No.2

VBA が全く判らなくても、コピペ位はできるでしょう。 VBA が全く判らなくても、フォームにコマンドボタンは配置できるでしょう。 <仕入記録> ID____商品マスター_ID_仕入数量_仕入単価 1_____商品A______________10___________\1,000 2_____商品A______________20___________\1,000 3_____商品B______________15___________\1,500 このようなテーブルがあったとします。 クエリ1=SELECT 仕入記録.*, * FROM 仕入記録; というクエリを用意します。 もちろん、このクエリは<仕入記録>を全て表示します。 <クエリ1> ID____商品マスター_ID_仕入数量_仕入単価 1_____商品A______________10___________\1,000 さて、クエリ1をフォームのコマンドボタンで表示するとこのようになりました。 仕入数量=20 仕入単価=1500 を削除した結果を表示しているからです。 Private Sub コマンド0_Click() On Error Resume Next   CnnExecute ("DELETE FROM 仕入記録 WHERE 仕入単価=1500;")   CnnExecute ("DELETE FROM 仕入記録 WHERE 仕入数量=20;")   DoCmd.OpenQuery "クエリ1" End Sub ところで、フォームのコマンドボタンの書いたVBAのコードはこのように実に簡単なものです。 DELETE文は、質問者が作成されたクエリをコピーされても動作します。 クエリをSQLビューで表示すれば、クエリはSQL文の形で表示されます。 どうでしょう、この位のコードですと書けるのじゃないでしょうか? なお、CnnExecute は、後で補足します。

noname#41715
質問者

補足

ご回答ありがとうございます。CnnExecuteの意味はさっぱりなのですが、この処理をクエリ1、クエリ2というように連続させる場合はどのようになるのでしょうか? それと、ずーずーしいのですが、たとえば「テキストBOX1」に"1"を入力したらクエリの1を実行…とする場合のIF文もできれば教えていただきたいのですが…。

  • fly_moon
  • ベストアンサー率20% (213/1046)
回答No.1

ごめんなさい。やりたいことが解りかねます。 元データを削除したいのですか?それとも、3つの条件でデータを抽出したいだけでしょうか?どちらにしても、3つのクエリの意味がわかりません。1つのクエリに3つの条件を指定すれば良いのでは?

noname#41715
質問者

補足

説明不足ですみません。ひとつのクエリで3つの条件を指定すれば…そうなのですが、条件用のクエリをそれぞれ間に挟んでおり、一度に指定するのは出来ませんでした。(私が出来なかっただけかもしれませんが) 削除用のデータをクエリで3つ用意して、それを除いたデータを元テーブルから抽出したいのです。 そして、そのクエリ3つのうち、削除したいクエリを選択できるようにしたいと思っています。 例えば、クエリの1と3にを指定した場合はクエリの2を無視してデータを抽出する…というような仕組みです。 VBAのことはさっぱりですが、これをボタン一つで処理出来れば、と思いました。 このような説明で分かってもらえたでしょうか?無茶苦茶なこと言っていたら申し訳ありません。

関連するQ&A

専門家に質問してみよう