• ベストアンサー

Access、SQLステートメントでの仮テーブルの作り方について

AccessのSQLステートメントで仮テーブルを使ったSQLを作りたいのですが、構文の書き方がよくわかりません。 わからないなりに以下のようなSQL文を作ってみたのですが、 SELECT TBL.NO FROM [SELECT NO FROM ○○TBL WHERE △△="△△" GROUP BY NO HAVING (Mid(××,2,1)="K") ]. AS TBL; (本当はWHEREのあとにANDがたくさんあります) 実行すると、 「パラメータや別名が正しいこと、無効な文字や区切り記号が含まれていないこと、または名前が長すぎないことを確認してください。」 とメッセージが出ます。 仮テーブルに長いSELECT文をつかうことはできないのでしょうか? ちなみに環境はOS:Win2000+Access2000です。 どなたかアドバイスください。 よろしくお願いします。

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

  • ベストアンサー
  • Euglena
  • ベストアンサー率62% (5/8)
回答No.5

すみません。↓の回答見てませんでした(^^; 二次問い合わせでできませんでしょうか? SELECT * FROM ○○TBL WHERE NO IN ( SELECT NO FROM ○○TBL WHERE △△ = "△△" AND ・・・) という具合で。 ただ、○○TBL内での選択のみだと無意味なんですが・・ SELECT * FROM ××TBL WHERE NO IN ( SELECT NO FROM ○○TBL WHERE △△ = "△△" AND ・・・)  ↑ ○○TBLでの抽出条件を満たすNOを持つ××TBLのレコードを抽出する。 みたいなのが普通?です。

XN12A
質問者

お礼

アドバイスありがとうございます。 教えていただいたやりかたでいける!っとおもってやってみたのですが、クエリだとうまくいくのに、SQLステートメントだと「無効な処理です」とエラーが返ってきます。 んーんなんででしょう?

XN12A
質問者

補足

できました!ありがとうございます! SQLは間違っておらずその他の原因で「無効な処理」と出ていたようです。 このようなときは2次問い合わせをすればできるのですね!解決してよかったです。

その他の回答 (7)

noname#5584
noname#5584
回答No.8

Jetでは、インラインビューの構文は、 ( ) ではなく、 [ ]. です。 ( ) で記述しても、保存すると、[ ]. に書き換えられます。 ( Jet 3.xでは、最初から[ ]. で記述しないと、構文エラーで通してくれません ) ただし、Jetでどこまでインラインビューがサポートされるか、疑問な部分もあります。

XN12A
質問者

お礼

アドバイスありがとうございます。 インランビューには限界があるということでしょうか? 今の時点では、SQL文が間違っているのか、そもそもそんなSQL文はAccessでは実行不可能なのかわからなくて困っております。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.7

>わざわざCreateTableするまでもないので、選択クエリのみでできないかと思い質問をしました。 インラインビューですね。 Access2000ということなので、こんな感じで可能です。 select * from (select * from tableA) where item = "A"; 一時的な選択クエリーは()で囲みます。

XN12A
質問者

お礼

アドバイスありがとうございます。 すいません教えていただいたSQL文の意味がわかりません...。 >where item = "A"; というのはどこの"A"を参照しているのですか? tableAという名前のテーブルという意味ですか? それともtableをAという名前を付けるよ。という意味でしょうか?

回答No.6

FROM [ ~ ]. AS TBL の"["、"]"や"."はまずいだろうと思って試してみたら予想外の結果になってしまった(^^;)ので単なるアドバイスですが、まずはあなたが[]内で記述しているSELECT文が正常に実行されるかどうか確認してみては?

XN12A
質問者

お礼

アドバイスありがとうございます。 予想外でしたか(汗 このようなやりかたは一般的ではないのですかね。 ちなみにSELECT文そのものは間違いなく動作します。

  • Euglena
  • ベストアンサー率62% (5/8)
回答No.4

了解しました。 選択クエリーを作成すればOKだと思います。 SELECT NO FROM ○○TBL WHERE ・・・ で選択クエリーを作成しておきます。 その結果を別のクエリーで参照するときは、 SELECT [選択クエリー名].NO FROM [選択クエリー名] WHERE ・・ これならば、テーブルの実体を作成せずに、 都度○○TBLからデータを抽出するようになります。

noname#5584
noname#5584
回答No.3

Jet 専用の構文ですが、 SELECT ........ INTO [Destination] FROM [SOURCE] でCREATE TABLE [Destination] と INSTERT INTO ........ [Destination] SELECT ........ FROM [SOURCE] を併せた動作になります。 ( 詳細は、ヘルプで ) ※ 他のDBMS ( Oracle、SQL Server 等 ) では使用できません。

XN12A
質問者

お礼

アドバイスありがとうございます。 CREATE TABLEやINSERTではなく、選択クエリを使った方法を模索しております。 ただ、そのために選択クエリを何階層も繋るとたくさんの選択クエリを作らなくてはならないので、SQLステートメントをつかってそれを実現したいと思っております。

  • Euglena
  • ベストアンサー率62% (5/8)
回答No.2

SELECT TBL.NO FROM ○○TBL TBL WHERE △△ = "△△" ・・・ ということとは違う・・かな、やっぱり。 TBLが○○TBLをもとに新たに作成されるのか、 TBLという○○TBLの別名でいいのか見当がつきませんので・・

XN12A
質問者

補足

すいません書き方が悪かったですね。 ○○TBLというマスタ(○○TBLマスタというテーブルがあるという意味)があってその中からWHERE、GROUPBY、HAVINGで抽出した結果をTBLという仮テーブルで宣言したいということなんですけど。(TBLというテーブルが存在するわけではなく、FROM句後で宣言して仮に作るというような主旨なんですけど) 自分がわかっていないだけに説明が難しいですね。 わかっていただけたでしょうか?

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

とりあえず、対象となるデータの選択クエリは作成できますか? あとは、それをテーブル作成クエリーに変えてしまえば楽だと思いますけど。

XN12A
質問者

お礼

アドバイスありがとうございます。 わざわざCreateTableするまでもないので、選択クエリのみでできないかと思い質問をしました。 ですので、できればテーブルを作らない方法でいきたいです。(汗

関連するQ&A