人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

オラクルマスターSilver9iの対策問題集の練習問題で、ビューに関するSQL文がありました。下の4つの文のうち間違っているものを1つ選びなさい、というものです。

a.CREATE OR REPLACE VIEW emp_view AS SELECT ename_view AS SELECT ename, sal, sal+NVL(comm,0) wages FROM emp;

b.CREATE VIEW emp_view AS SELECT empno,ename, deptno FROM emp ORDER BY empno;

c.CREATE VIEW emp_view AS SELECT deptno,count(*) FROM emp GROUP BY deptno;

d.CREATE VIEW emp_view(deptno,sum_sal,avg_sal,max_sal) AS SELECT deptno,SUM(sal), AVG(sal), MAX(sal) FROM emp GROUP BY deptno;

e.CREATE VIEW emp_view AS SELECT DISTINCT job FROM emp;
-------------------------------------------------------------
正解を見ると C となっています。しかし、解説を読んでもなぜなのかよく判りません。
Oracleにお詳しい方どなたか判りやすく解説していただけないでしょうか? よろしくお願いします。

●質問者: わにかめ78
●カテゴリ:コンピュータ 書籍・音楽・映画
✍キーワード:AS AVG GROUP Max Oracle
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● kazz7
●20ポイント

c.のcreate view文でemp_viewを作成したときには、count(*) の部分でORA-998エラーとなります。

ORA-00998: 式に列の別名を指定する必要があります。

このエラーを回避するためには、count(*) "列名" という形で、なにがしかの列名を指定してやれば大丈夫です。

以下、実行例です。

SQL> CREATE or REPLACE VIEW emp_view AS SELECT deptno,count(*) FROM emp GROUP BY deptno;
CREATE or REPLACE VIEW emp_view AS SELECT deptno,count(*) FROM emp GROUP BY deptno
 *
行1でエラーが発生しました。:
ORA-00998: 式に列の別名を指定する必要があります。


SQL> CREATE or REPLACE VIEW emp_view AS SELECT deptno,count(*) "CNT" FROM emp GROUP BY deptno;

ビューが作成されました。

SQL> desc emp_view
 名前 NULL? 型
 ----------------------------------------- -------- ----------------------------
 DEPTNO NUMBER(2)
 CNT NUMBER

SQL>

◎質問者からの返答

式に別名が必要なことがよく判りました。ありがとうございました。


2 ● un0
●30ポイント

a)これは転記ミスでしょうか。

そのまま流すと、「ORA-00923: FROMキーワードが指定の位置にありません。」となります。

『AS SELECT ename_view 』が不要です。

b)正しい

c)「ORA-00998: 式に列の別名を指定する必要があります。」となります。

これは、作成されるVIEWの列名を省略している。

そのため『count(*)』という列名を作成しようとしてエラーとなっています。

これを明示的に(例えばcount_all)指定することで解決できます。

具体的には以下のようにするとOKです。

例)CREATE VIEW emp_view (deptno,count_all) AS SELECT deptno,count(*) FROM emp GROUP BY deptno;

d)正しい

e)正しい

対策本を読むだけではなく、

・実機でSQLを流してみる

・エラーが出たらマニュアル「メッセージリファレンス」をよむ

ことをおすすめしますよ。遠回りのようですが結局はそれが近道になります。

OTN

http://otn.oracle.co.jp/

はご存知でしょうか。

・評価版のダウンロード

・マニュアルのダウンロード

などできます。

がんばってください。

◎質問者からの返答

なるほど。確かにa)は転記ミスです。

評価版のWEBサイトまでご紹介頂きありがとうございました。


3 ● AketiJyuuzou
●30ポイント ベストアンサー

CREATE VIEW emp_view AS SELECT deptno,count(*) FROM emp GROUP BY deptno;

これは、count(*)に列別名が指定されてないからです

似たようなcreate viewのaの

a.CREATE OR REPLACE VIEW emp_view AS SELECT ename_view AS SELECT ename, sal, sal+NVL(comm,0) wages FROM emp;

これは、sal+NVL(comm,0)にwages という列別名が与えられてますよね


テスト対策としては、列別名が不明なselect文でビューを作るとエラーになると覚えておけばいいでしょう

◎質問者からの返答

最も判りやすい説明のみならず、別名はビューを作るときにSELECT文内に書く事も判りました。ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ