質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

12528閲覧

SQLのCREATE VIEW文について

Ritz_Malheur

総合スコア11

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2015/05/06 04:12

編集2015/05/06 23:09

よろしくお願いいたします。

『ゼロからはじめるデータベース操作 SQL』(翔泳社)を使ってSQLの勉強をしております。
そのなかで、CREATE VIEW文についてエラーが出てしまい、検索してもわからないため、質問させて頂きました。

SQL文は、
CREATE VIEW ShohinSum (shohin_bunrui, cnt_shohin)
AS
SELECT shohin_bunrui, COUNT(*) FROM Shohin
GROUP BY shohin_bunrui;
という文になります。

これを『A5M2』というSQLを実行するソフトを使って実行すると、
『[Microsoft][ODBC Microsoft Access Driver] PARAMETER句の構文エラーです。』
と出てしまいます。
Accessで同じ文を起動しても実行できませんでした。

また、ビュー名とビュー列名のスペースをなくすと、
実行できるようになります。
ShohinSum(shohin_bunrui,cnt_shohin) は実行 可能
ShohinSum (shohin_bunrui, cnt_shohin) はエラー

しかし、この後にビューを使う
SELECT shohin_bunrui, cnt_shohin
FROM ShohinSum;
を実行すると、
『[Microsoft][ODBC Microsoft Access Driver]入力テーブルまたはクエリ'ShohinSum'が見つかりませんでした。』
と出てしまいます。
恐らく、スペースの関係で、ビュー名がビュー列名とくっ付いてしまったのではないかと思います
(A5M2の画面左側にテーブルやビューの名前がでるところがあるのですが、ShohinSumだけ長くなってしまっているため)。

原因がわかる方がいらっしゃいましたら、教えて頂けると幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

今後、質問するときはデータベースに何を使っているかと、
どうやって接続しているかも書いてくださいね。

エラーメッセージから判断するに Access の mdb か accdb に
ODBC で接続していると思われるので、それを想定して回答いたします。


なぜ思った通りに動かないか?

原因だけ言ってしまうと ODBC で接続しているためです。
ADO で接続すれば質問文に書かれているSQL文でちゃんと動きます。

私は A5M2 を初めて使いましたが、以下のようにすれば ADO で接続できるようです。
0. 追加するデータベースの接続タイプを選択の画面で "ADO (OLE DB, ODBC)" を選択する。
0. 接続文字列の右側のボタンをクリックする。
0. mdbファイルに接続するには "Microsoft Jet ?.? OLE DB Provider" を選択する。accdbファイルに接続するには "Microsoft Office ?.? Database Engine OLE DB Provider" を選択する。
0. データベース名(データソース)には mdbファイル(accdbファイル)のパスを記入する。


** ODBCで接続したときに何が起こっていたか?**

また、ビュー名とビュー列名のスペースをなくすと、
実行できるようになります。
ShohinSum(shohin_bunrui,cnt_shohin) は実行 可能
ShohinSum (shohin_bunrui, cnt_shohin) はエラー

恐らく、スペースの関係で、ビュー名がビュー列名とくっ付いてしまったのではないかと思います

ご想像の通りビュー名とビュー列名がくっついて、全体がビュー名となっているため、
実行できたときは ShohinSum ではなく ShohinSum(shohin_bunrui,cnt_shohin) という名前の
ビュー(Access的に言えばクエリー)が生成されています。

そんな名前のビューを SELECT するときは以下のようなSQL文になります。

lang

1SELECT * FROM [ShohinSum(shohin_bunrui,cnt_shohin)];

ビュー名に括弧とかカンマのような特殊な文字を使用しているため、
名前を [] で囲む必要があります。
そして生成したビューをODBC接続で削除したいときは

lang

1DROP VIEW [ShohinSum(shohin_bunrui,cnt_shohin)];

ではなく

lang

1DROP TABLE [ShohinSum(shohin_bunrui,cnt_shohin)];

になります。


** ODBC接続では出来ないのか?**

以下のように SELECT の段階で列に名前を付ければODBC接続でも出来ます。

lang

1CREATE VIEW ShohinSum AS 2SELECT shohin_bunrui, COUNT(*) AS cnt_shohin FROM Shohin 3GROUP BY shohin_bunrui;

投稿2015/05/07 03:48

編集2015/05/07 08:14
twck

総合スコア314

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ritz_Malheur

2015/05/07 14:10

ご丁寧にありがとうございました!教えて頂いた通りに実行させて頂き、 無事にできるようになりました。 質問についてあいまいだった点が多く、申し訳ありませんでした。以後気を付けます。
guest

0

CREATE VIEW に引数は不要です。

CREATE VIEW ShohinSum (shohin_bunrui, cnt_shohin)
から
CREATE VIEW ShohinSum
に変更するといいと思います。

仮に、引数を渡して何かしらの処理をさせたいのならストアドプロシージャがおすすめです。

投稿2015/05/07 00:46

shu21

総合スコア106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ritz_Malheur

2015/05/07 14:11

ありがとうございました! CREATE VIEWに引数が不要だということを初めて知り、勉強になりました。 オススメも教えて頂き、ありがとうございます。使ってみます!
guest

0

正しいSQLは以下のようではないでしょうか?

lang

1CREATE VIEW ShohinSum 2AS 3SELECT shohin_bunrui, COUNT(*) AS cnt_shohin FROM Shohin 4GROUP BY shohin_bunrui; 5

投稿2015/05/07 00:31

orange0190

総合スコア1698

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ritz_Malheur

2015/05/07 14:12

ありがとうございます! 書いて頂いたSQL文で実行できました! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問