こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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です。

どなたかアドバイスください。
よろしくお願いします。

投稿日時 - 2003-11-18 15:06:35

QNo.708895

すぐに回答ほしいです

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

すみません。↓の回答見てませんでした(^^;
二次問い合わせでできませんでしょうか?

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のレコードを抽出する。
みたいなのが普通?です。

投稿日時 - 2003-11-18 16:46:36

補足

できました!ありがとうございます!

SQLは間違っておらずその他の原因で「無効な処理」と出ていたようです。

このようなときは2次問い合わせをすればできるのですね!解決してよかったです。

投稿日時 - 2003-11-19 09:18:58

お礼

アドバイスありがとうございます。

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

んーんなんででしょう?

投稿日時 - 2003-11-19 08:42:46

ANo.5

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.8

Jetでは、インラインビューの構文は、
( )
ではなく、
[ ].
です。
( ) で記述しても、保存すると、[ ]. に書き換えられます。
( Jet 3.xでは、最初から[ ]. で記述しないと、構文エラーで通してくれません )

ただし、Jetでどこまでインラインビューがサポートされるか、疑問な部分もあります。

投稿日時 - 2003-11-18 18:54:28

お礼

アドバイスありがとうございます。

インランビューには限界があるということでしょうか?

今の時点では、SQL文が間違っているのか、そもそもそんなSQL文はAccessでは実行不可能なのかわからなくて困っております。

投稿日時 - 2003-11-19 08:49:57

ANo.7

>わざわざCreateTableするまでもないので、選択クエリのみでできないかと思い質問をしました。

インラインビューですね。
Access2000ということなので、こんな感じで可能です。

select * from (select * from tableA)
where item = "A";


一時的な選択クエリーは()で囲みます。

投稿日時 - 2003-11-18 18:49:16

お礼

アドバイスありがとうございます。

すいません教えていただいたSQL文の意味がわかりません...。

>where item = "A";
というのはどこの"A"を参照しているのですか?

tableAという名前のテーブルという意味ですか?
それともtableをAという名前を付けるよ。という意味でしょうか?

投稿日時 - 2003-11-19 08:47:18

ANo.6

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

投稿日時 - 2003-11-18 17:14:52

お礼

アドバイスありがとうございます。

予想外でしたか(汗
このようなやりかたは一般的ではないのですかね。

ちなみにSELECT文そのものは間違いなく動作します。

投稿日時 - 2003-11-18 17:32:45

ANo.4

了解しました。
選択クエリーを作成すればOKだと思います。

SELECT NO FROM ○○TBL WHERE ・・・
で選択クエリーを作成しておきます。

その結果を別のクエリーで参照するときは、
SELECT [選択クエリー名].NO FROM [選択クエリー名]
WHERE ・・

これならば、テーブルの実体を作成せずに、
都度○○TBLからデータを抽出するようになります。

投稿日時 - 2003-11-18 16:29:54

ANo.3

Jet 専用の構文ですが、

SELECT ........ INTO [Destination] FROM [SOURCE]

でCREATE TABLE [Destination] と INSTERT INTO ........ [Destination] SELECT ........ FROM [SOURCE]

を併せた動作になります。
( 詳細は、ヘルプで )

※ 他のDBMS ( Oracle、SQL Server 等 ) では使用できません。

投稿日時 - 2003-11-18 15:56:35

お礼

アドバイスありがとうございます。

CREATE TABLEやINSERTではなく、選択クエリを使った方法を模索しております。

ただ、そのために選択クエリを何階層も繋るとたくさんの選択クエリを作らなくてはならないので、SQLステートメントをつかってそれを実現したいと思っております。

投稿日時 - 2003-11-18 16:25:26

ANo.2

SELECT TBL.NO FROM ○○TBL TBL
WHERE △△ = "△△" ・・・

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

投稿日時 - 2003-11-18 15:22:40

補足

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

自分がわかっていないだけに説明が難しいですね。
わかっていただけたでしょうか?

投稿日時 - 2003-11-18 15:25:58

ANo.1

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

投稿日時 - 2003-11-18 15:18:12

お礼

アドバイスありがとうございます。

わざわざCreateTableするまでもないので、選択クエリのみでできないかと思い質問をしました。

ですので、できればテーブルを作らない方法でいきたいです。(汗

投稿日時 - 2003-11-18 15:38:24

あなたにオススメの質問