rink_rewさんの投稿一覧
実際に試してみるとわかりますが、エラーにならずに削除できます。
SQL> CREATE TABLE parent
2 (
3 id NUMBER(2) CONSTRAINT pid_pk PRIMARY KEY,
4 dept_name VARCHAR2(10)
5 );
表が作成されました。
SQL> CREATE TABLE child
2 (
3 id NUMBER(2) CONSTRAINT cid_pk PRIMARY KEY,
4 name VARCHAR2(10) CONSTRAINT cname_uq UNIQUE,
5 deptid NUMBER(2) CONSTRAINT dept_fk REFERENCES parent (id) ON DELETE CASCADE
6 );
表が作成されました。
SQL> INSERT INTO parent VALUES (1, 'parent');
1行が作成されました。
SQL> INSERT INTO child VALUES (10, 'child', 1);
1行が作成されました。
SQL> ALTER TABLE child DROP (id);
表が変更されました。
SQL> desc child
名前 NULL? 型
----------------------------------------- -------- ----------------------------
NAME VARCHAR2(10)
DEPTID NUMBER(2)
SQL>
たとえば、列pkを他の表から参照する参照制約が他に存在しない場合は、次の文を指定するときにCASCADE CONSTRAINTS句がなくてもエラーにはなりません。
この設問においては、問題文のように別名なしでも結果は同じになると思いますが、実務上は特に可読性の観点からも必ず別名つけますよね(JOINするような場合ならもちろん)。
手持ちの試験対策系テキストを少し見て見ましたが、インラインビューの解説の中で別名を使っていないSQLも掲載されているようでした。FROM句に指定する副問合せの説明としては問題なさそうです。
ちょうど類似の投稿があったので私も調べて見たのですが、本問題でも説明されているように、COALESCE関数ではすべての引数は同じデータ型でなければならず、実行例のとおりエラーになります。
https://mondai.ping-t.com/g/posts/2173
ちなみに黒本(オラクルマスター教科書)などの記載も同様で「引数は同じデータ型である必要がある」という記載になってますね。
Oracleデータベースとしては様々な場面で暗黙的なデータ型変換をしてくれますが、本問題の「参考」に示されているように、COALESCE関数では、すべての引数は同じデータ型でなければならないため、異なるデータ型の値を指定すると基本的にエラーとなります。
SQL> desc test_coalesce01
名前 NULL? 型
----------------------------------------- -------- ----------------------------
COL1 NUMBER
COL2 VARCHAR2(20)
SQL> SELECT * FROM test_coalesce01;
COL1 COL2
---------- --------------------
10 100
SQL> SELECT COALESCE(col1, col2) FROM test_coalesce01;
SELECT COALESCE(col1, col2) FROM test_coalesce01
*
行1でエラーが発生しました。:
ORA-00932: データ型が一致しません: NUMBERが予想されましたがCHARです。
もちろん、明示的に変換すればエラーにはなりません。
SQL> SELECT COALESCE(to_char(col1), col2) FROM test_coalesce01;
COALESCE(TO_CHAR(COL1),COL2)
----------------------------------------
10
SQL> SELECT COALESCE(col1, to_number(col2)) FROM test_coalesce01;
COALESCE(COL1,TO_NUMBER(COL2))
------------------------------
10
SQL>
公式マニュアルに記載の文章については、文字->数値や日付->文字のような、よく言う暗黙的データ変換ではなく、同じ数値<->数値や日付<->日付での処理を指しているようです。
DATE型とTIMESTAMP型で試して見たら、型は異なりますがエラーにならずに結果が返されました。
SQL> desc test_coalesce_conv01
名前 NULL? 型
----------------------------------------- -------- ----------------------------
COL1 TIMESTAMP(6)
COL2 DATE
SQL> SELECT * FROM test_coalesce_conv01;
COL1
---------------------------------------------------------------------------
COL2
--------
25-12-08 05:59:08.325928
25-01-01
SQL> SELECT COALESCE(col1, col2) FROM test_coalesce_conv01;
COALESCE(COL1,COL2)
---------------------------------------------------------------------------
25-12-08 05:59:08.325928
SQL>
「LED」は、辞書で引こうとすると
「LE」よりは後ろになる。
※広辞苑でいえば、「愛(あい)」よりも「間(あいだ)」の方が後ろになるイメージ。同じ理論で「LAN」は「LE」よりは前になる。
※広辞苑でいうところの、「間(あいだ)」が「赤(あか)」より前になるイメージ。「HI~」については、「LE」よりも前。
※そもそも頭文字が「L」より前な「H」なので、
辞書で引いたら圧倒的に早く出てくるといった具合。
そうですね。その理解で良いと思います。