オラクルマスター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にお詳しい方どなたか判りやすく解説していただけないでしょうか? よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2006/10/27 02:32:41
  • 終了:2006/10/27 10:58:07

ベストアンサー

id:AketiJyuuzou No.3

AketiJyuuzou回答回数5ベストアンサー獲得回数32006/10/27 10:23:11

ポイント30pt

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文でビューを作るとエラーになると覚えておけばいいでしょう

id:takao78ks

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

2006/10/27 10:54:54

その他の回答(2件)

id:kazz7 No.1

kazz7回答回数446ベストアンサー獲得回数142006/10/27 07:30:55

ポイント20pt

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>

id:takao78ks

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

2006/10/27 10:51:07
id:un0 No.2

un0回答回数651ベストアンサー獲得回数322006/10/27 09:40:03

ポイント30pt

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/

はご存知でしょうか。

・評価版のダウンロード

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

などできます。

がんばってください。

id:takao78ks

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

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

2006/10/27 10:52:10
id:AketiJyuuzou No.3

AketiJyuuzou回答回数5ベストアンサー獲得回数32006/10/27 10:23:11ここでベストアンサー

ポイント30pt

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文でビューを作るとエラーになると覚えておけばいいでしょう

id:takao78ks

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

2006/10/27 10:54:54

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません