• ベストアンサー

翔泳社オラクルマスター教科書Silver

翔泳社オラクルマスター教科書Silverを使ってシルバー取得の勉強をしていますが、どうもこの本の解答に納得のいかない点が多すぎで、このあいだから立て続けに質問してしまってごめんなさい。 何しろ知識が無さ過ぎて、本があっているのか、自分がおかしいのか、判断しかねるのです。 で、今日はこの問題です。 ---問題ここから--- 次の結合文の中で実行時にエラーになるものをひとつ選びなさい a.SELECT DEPT.DEPTNO,EMP.ENAME FROM DEPT D,EMP E WHERE DEPT.DEPTNO=EMP.DEPTNO; b.SELECT ENAME,SAL,GRADE FROM SALGTADE,EMP WHERE SAL>=LOSAL AND SAL<=HISAL; c.SELECT DEPT.DEPTNO,DMP.ENAME FROM DEPT,EMP WHERE DEPT.DEPTNO(+)=EMP.DEPTNO; D.SELECT D.DEPTNO,E.ENAME FROM DEPT D,EMP E WHERE D.DEPTNO=E.DEPTNO; ----問題ここまで---- で、この答えが選択肢aとなっているのですが、納得できません。 解説によれば、「FROM句で二つ以上の表を指定した場合、SELECT句やWHERE句で指定する列名は、どの表の列か判断できなければいけません。」 とあります。 つまり、正解は「どの表か明示的に表示していない」選択肢b だと思うのですが、やはり教科書があっていますか?? 私の考え方はどう間違っているのか、教えていただけたら嬉しいです。 どうかよろしくお願い致します☆

  • piyora
  • お礼率99% (471/472)

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

  • ベストアンサー
回答No.4

まず、とっくにお分かりかも知れませんが、「FROM句で二つ以上の表を指定した場合、SELECT句やWHERE句で指定する列名は、どの表の列か判断できなければいけません。」 というのは、けっして、「必ずSLECT句やWHERE句でどの表の列かを明示しないといけない」ということではありません。 データベースソフトが区別できない場合(=2つの表に同名の列がある場合)に限って、明示しないといけないという意味です。 で、考えると、この問題の対象となるデータベース例が示されていませんので、ハッキリしたことは言えませんが、やはり答えは「a」でよいのではないでしょうか。 なお、同社の出版物は同社のWeb上に正誤表が載っています(若干、間違いが多いのは問題ですが、良心的な方かと)。 一応あたってみましたが、この箇所らしき、正誤は載っていませんでした(別の正誤は多数載っていますので、一度、参照された方がよいかと)。

参考URL:
http://www.shoeisha.co.jp/
piyora
質問者

お礼

こんばんわ! せっかく回答いただいたのにお礼が遅くなってしまってごめんなさい! >まず、とっくにお分かりかも知れませんが、「FROM句で二つ以上の表を指定した場合、SELECT句やWHERE句で指定する列名は、どの表の列か判断できなければいけません。」 というのは、けっして、「必ずSLECT句やWHERE句でどの表の列かを明示しないといけない」ということではありません。 ああ~~~やっとわかりました! いえ、とっくにお分かりではありませんでした。 教えていただいて良かったです~~!! 別に、別名をつけなくても、ふたつのテーブルで重複する列名がなければ そのまま書いていいんですねー! すごく良くわかりました。 こんな風に解説してくれる人がまわりにいないので・・・。 貧脳の私にもよくわかりました。 それに本の正誤表まで・・いたれりつくせりです。 これで自分の知識のなさを本のせいにすることもなくなりそうです(笑)。 感謝です。ありがとうございました!

その他の回答 (4)

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.5

こんにちわ。 > つまり、正解は「どの表か明示的に表示していない」選択肢b > だと思うのですが、やはり教科書があっていますか?? nanashinogombei さんがおっしゃられている通り、 FROM 句で、DEPT D, EMP E と別名を指定しているにも関わらず カラム名を別名で修飾していないために、a がエラーに なります。 こう言った事は、手元に確認できる環境を用意しておいた方が 良いですょ。 雑誌の付録CD-ROM や、OTN Japan 等からトライアル版が 入手できます。 先ずは実際にSQL 文を実行してみて、バンバンエラーを出して みて下さい。 → そうした方が確実に力がつきます。

参考URL:
http://technet.oracle.co.jp/
piyora
質問者

お礼

こんばんわ! せっかく回答いただいたのに、お礼が遅くなってしまってごめんなさい! >先ずは実際にSQL 文を実行してみて、バンバンエラーを出して みて下さい。 → そうした方が確実に力がつきます そうですよね~~~。 実はあたし、オラクルって触ったことないんです(笑)。 たぶんオラクルをインストールしても使い方がわからないと思うので・・・ こんなあたしがオラクルの資格をとるなんて無謀ですよね~~~! はぁ、でもがんばります。 みなさんにも色々教えていただいたし。 がんばるぞー!ありがとうございました!!

noname#4564
noname#4564
回答No.3

No.2 の誤字訂正です。 × おなじ趣旨なら、AのSQLより、EのSQLの方が適切に見えます。             ↓ ○ おなじ趣旨なら、AのSQLより、DのSQLの方が適切に見えます。 失礼しました。 m(_ _)m

piyora
質問者

お礼

はい、意味はわかりましたよ! わざわざ訂正していただいてありがとうございます☆

noname#4564
noname#4564
回答No.2

> a.SELECT DEPT.DEPTNO,EMP.ENAME > FROM DEPT D,EMP E > WHERE DEPT.DEPTNO=EMP.DEPTNO; もう一度見直して見たのですが、表にエイリアス(別名)を付けているのに、 カラム名をエイリアスで修飾せずに元の(本来の)テーブル名で修飾しているので、たぶんエラーになると思います。 (手元にオラクルがないので、確認できませんが) おなじ趣旨なら、AのSQLより、EのSQLの方が適切に見えます。 選択肢BのSQLがエラーになるかどうかは、使用しているテーブルを実際に見ないと(SQL文だけでは)判断できないと思います。 そして、Cの選択肢ですが、テーブル名に誤字(「EMP」表とすべきところがDMPとなっている)がありますので、確実にエラーになります。 これも誤字なら、本当にヒドイ本ですね! 出版社に文句を言った方がよいかもしれません。  

piyora
質問者

お礼

今度は回答のほうを、ありがとうございます! どうやら教科書どおり、Aが正解のようですね。 カラム名に別名をつけているにもかかわらず、元のテーブル名で記述しているのでだめ、ということですよね。 よくわかりました。どうもありがとうございます!! PSそれから、EMP→DMPは、私の写し間違いでした・・・ ひどいのは私のほうです・・・すみませんでした(^^;

noname#4564
noname#4564
回答No.1

回答ではありませんが・・・。 はっきり言って、専門書の内容の間違いなんて珍しくも何ともありません。 ご質問のケースがやっかいなのは、その書籍が正しくないとしても、それを検証する手段がないことです。 実務なら、そのSQLを実際に実行してみれば簡単にわかることですが。 確認できないことで悩んでも仕方がない(時間の無駄)と思います。 最近はCDの付録がついた書籍も多いので、勉強するならそういう本を選んだ方がよいのでは? もしお手元にオラクルの環境があるなら、実際に確認するのが一番です。 (胸の支えがスッキリすることでしょう) とは言っても、問題文で表(テーブル)の定義が示されていなければ、それもむずかしいかもしれませんが・・・。 どうしても納得がいかないなら、書面かメールで出版社に問い合せて見ましょう。(ただし、誠意のある回答は期待しないことです) ・・・結局、何が言いたいのかよくわからないコメントになってしまいましたが、参考になれば幸いです・・・。

piyora
質問者

お礼

こんばんわ! せっかく回答いただいたのにお礼が遅くなってしまってごめんなさい! そうですかあ、教科書といえども信用してはならないんですね~~~ でもオラクルなんて実際使ったこともない私にとっては教科書が唯一の情報源なんです(T^T) ひとつだけじゃなく、いろんな参考書を見るようにして勉強します。 一冊だけでももうほとほと疲れちゃってるんですけど~~~ がんばります!!ありがとうございました☆

関連するQ&A

  • エラー2「無効な識別子です」

    ORA-00904: "D"."DEPT": 無効な識別子です。 先ほども似たような質問をしましたが原因がよく分からないなのでご存知の方教えていただければ幸いです。 SELECT D.DEPTNO, E.ENAME, E.SAL FROM EMP E, DEPT D WHERE E.SAL >ANY (SELECT MAX(E.SAL) FROM DEPT D, EMP E GROUP BY D.DEPT) SQL> DESCRIBE EMP; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2) SQL> DESCRIBE DEPT; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- DEPTNO NOT NULL NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13)

  • 外部結合について

    以下のSQLの2つの結果は同じでしょうか? LEFT OUTHERは、ON句の中の左の表を全て取得するというものでしょうか? SELECT ename, dname, jname FROM emp e LEFT OUTHER JOIN dept d ON (e.deptno=d.deptno) LEFT OUTHER JOIN job j ON (e.jobid=j.deptno); SELECT ename, dname, jname FROM emp e RIGHT OUTHER JOIN dept d ON (d.deptno=e.deptno) RIGHT OUTHER JOIN job j ON (j.jobid=e.deptno); よろしくお願いします。

  • 表の結合に関する質問

    EMP表 EMPNO ENAME JOBNO SAL DEPTNO ----- ------ ------ ----- ------ 1000 ADAMS 100 1000 10 1010 MILLER 200 1200 10 1020 SCOTT 100 800 30 DEPT表 DEPTNO DNAME EMPNO ----- ------ ------ 10 PERSONNEL 1000 20 ACCOUNT 30 DESIGN 上記表に対して、 [SQLコマンド] select e.empno , e.ename , dname , m.ename from emp e join dept d using(deptno) left outer join emp m on d.empno = m.empno; のSQL文を打つと、 EMPNO ENAME DNAME ENAME ----- ------ ------ ----- 1000 ADAMS PERSONNEL ADAMS 1010 MILLER PERSONNEL ADAMS 1020 SCOTT DESIGN と表示されますが、これが表示される過程がわからないです。 emp表とdep表をdeptno列で結合 from emp e join dept d using(deptno) この結合により EMPNO ENAME DNAME ・・・・・・ ----- ------ ------ ----- 1000 ADAMS PERSONNEL ・・・・・・ 1010 MILLER PERSONNEL ・・・・・・ 1020 SCOTT DESIGN ・・・・・・ となります。この部分は分かりますが、 次の、この表とemp表をempnoで結合 left outer join emp m on d.empno = m.empno; した際に、 EMPNO ENAME DNAME ENAME ----- ------ ------ ----- 1000 ADAMS PERSONNEL ADAMS 1010 MILLER PERSONNEL ADAMS 1020 SCOTT DESIGN となりますが、ENAME(4番目の列)で ADAMSと表示される過程が見えてきません。 この部分の過程について、ご教授の程お願い致します。

  • エラー「無効な識別子です」

    ORA-00904: "EMPNO": 無効な識別子です と表示されます。 解決方法知っている方、教えていただければ幸いです。 SELECT EMPNO, ENAME, D.DEPTNO, DNAME FROM DEPT D WHERE EMPNO = (SELECT EMPNO FROM EMP WHERE MGR IS NULL) SQL> DESCRIBE EMP; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2)

  • エラー「単一グループのグループ関数ではありません」

    エラーをどうやれば修正できるかわかりません。 回答のほどよろしくお願いいたします。 SELECT EMPNO, ENAME, DEPTNO, SAL FROM EMP HAVING AVG(SAL) >ANY (SELECT SAL FROM EMP WHERE HIREDATE LIKE '82%') SQL> DESCRIBE EMP; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2)

  • updateについて

    下記、SQLコマンドを実行するとMERTINの歩合給がSMITHのSALに格納されません。実行後、NULLが入ってしまいます。 ちゃんとemp表のMERTINのCOMMには値が入っているのになぜ実行結果がうまくいかないのでしょうか? 回答のほどよろしくお願い致します。 update w_emp set sal = (select comm from emp where ename = 'MERTIN') where sal < 1000 SQL> select * from w_emp; DEPTNO EMPNO ENAME JOB SAL 20 7902 FORD ANALYST 3000 20 7369 SMITH CLERK 10行が選択されました。 SQL> desc w_emp; 名前 NULL? 型 DEPTNO NOT NULL NUMBER(2) EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) SAL NUMBER(7,2) SQL> desc emp; 名前 NULL? 型 EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2)

  • 自分自身のテーブルを参照して更新

    ORACLEで簡単にできたのがSQLServerで上手くできなくて困っています。 下のようなSQLです。SQLServerでUPDATE時に別名を付けようとすると エラーになってしまいます。良いSQLをご教授頂ければ、と思います。 update emp e set sal=  (select max(ee.sal) from emp ee where e.deptno=ee.deptno)

  • 同一表に同一データがある場合のPLSQLの挙動

    お世話になります。 Oracle+PLSQL初心者です。 特定のPLSQLを発行した際の、同一データが同じ表内にある場合の動作について混乱しています。 条件を満たす列に対して値+100の反応を期待しているのですが、思うような結果が返ってきません。 偶然に上記挙動が発生し、同一データの重複が問題かなと問題のなさそうな表をつくり直したら同現象は発生しなくなりました。 1. 同じ表に2度同じデータをインサート(同一データが2つある状態) ID NAME SAL DEPT 1 TARO 0 10 2 HANAKO 100 20 1 TARO 0 10 2 HANAKO 100 20 2. 特定条件下(sal<1000, deptno=10)でsalが+100になるPLSQLを発行、COMMIT DECLARE CURSOR emp_cur IS SELECT sal, empno FROM emp WHERE deptno = 10; BEGIN FOR emp_rec IN emp_cur LOOP IF emp_rec.sal < 1000 THEN UPDATE emp SET sal = sal + 100 WHERE empno = emp_rec.EMPNO; END IF; END LOOP; END; / COMMIT; 3. SELECTでSALを確認すると200増えている(2倍) ID NAME SAL DEPT 1 TARO 200 10 2 HANAKO 100 20 1 TARO 200 10 2 HANAKO 100 20 個人的には下記のような値になると思っていました。 言葉で説明するのが難しいのですが、心当たりのある方がいらっしゃったらお答え願います。 よろしくお願い致します。 ID NAME SAL DEPT 1 TARO 100 10 2 HANAKO 100 20 1 TARO 100 10 2 HANAKO 100 20

  • SQLの問題で解答を見ても腑に落ちません

    問題集の答えが腑に落ちないのでどなたかわかりやすく説明いただけますでしょうか? EMP表 EMPNO ENAME  SAL   MGR  DEPTNO -------------------------------------- 1000  SCOTT  1000  NULL  10 1010  ADAMS  2000  1000  10 1030  TAYLOR  600   1000  30 1050  MILLER  800   1030  10 以下の副問い合わせを使ったSELECT文を実行した。検索されるデータ件数を選びなさい。 select empno,ename from emp where empno not in (select mgr from emp); A:0件 B:1件 C:2件 D:3件 解答はAの0件なのですが、なぜ0件なのでしょうか? 当方の解釈ですと、副問い合わせでmgrが(NULL,1000,1030)となり where empno not in (NULL,1000,1030) で 「empnoがNULLでも1000でも1030でもない件数」 となり、empnoが1010と1050の行が検索され、cの2件が正解なのでは? と思っているのですが・・・ 間違いをわかりやすく教えていただけますでしょうか? 宜しくお願いします。

  • 自己結合について

    下記SQL文のSELECT句、m.empnoによって左項DEPTNOのMGR値がきちんと出力される理屈がよく分かりません。 回答のほどよろしくお願い致します。 select e.empno, m.empno from emp e join emp m on(e.mgr = m.empno) EMPNO EMPNO ---------- ---------- 7698 7839 7782 7839 7566 7839 7902 7566 7369 7902 7499 7698 7521 7698 7654 7698 7788 7566 7844 7698 7876 7788 7900 7698 7934 7782 13行が選択されました。 SQL> describe emp; 名前 NULL? 型 ------------------------------ EMPNO  NOT NULL NUMBER(4) ENAME      VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO   NOT NULL NUMBER(2)