« 帰ってきた! 標準はあるにはあるが癖の多いSQL #15 - 実行計画でスカラー副問合せの見せ方にも癖がでる | トップページ | 実行計画は, SQL文のレントゲン写真だ! No.62 / ORDBMS機能であるコレクション型の列をアクセスする実行計画ってどうなるの? »

2024年7月11日 (木) / Author : Hiroshi Sekiguchi.

帰ってきた! 標準はあるにはあるが癖の多いSQL #16 - FROM句のインラインビューのエイリアスにもクセがある(必須だったり、任意だったり)

Previously on Mac De Oracle
前回の癖は、SELECTリストに記述したスカラー副問合せが実行計画上どうみせられるかにも癖がでるというお話でした。

 

今日は副問合せは副問合せでもインラインビューの話題です。
FROM句でインラインビューを使う場合、表エイリアスを記述しなくてもエラーにはならいってのは、Oraclerを長年やってると不思議なことではないというか、そういうものだと思ってたりします。
とはいえ、可読性含や不思議な結果になったりする不具合などに遭遇するリスクを回避する意味でも表エイリアスを記述するのが手癖になっているかたも多いのではないでしょうか。私もそうですw(コーディング規約にも記載されていることは多いと思いますし)

 

ということで、今日の癖を見てみることにしますw

 

 

Oracle Database (23ai) インラインビューで表エイリアスを記述しなくても文法エラーにはなりません。
Oracle Database / Release 19 / SQL言語リファレンス / SELECT / table_reference::=のダイアグラムにあるように表エイリアスを省略可能です。(前述したように省略しないことの方が多いですけども、可読性向上のためにも)

SCOTT@localhost:1521/freepdb1> @inlineview_alias_name.sql
1 SELECT
2 empno
3 ,ename
4 FROM
5 (
6 SELECT
7 empno
8 ,ename
9 ,mgr
10 FROM
11 emp
12 )
13 WHERE
14* mgr IS NULL

EMPNO ENAME
---------- ----------
7839 KING


1 SELECT
2 empno
3 ,ename
4 FROM
5 (
6 SELECT
7 /*+ NO_MERGE */
8 empno
9 ,ename
10 ,mgr
11 FROM
12 emp
13 )
14 WHERE
15* mgr IS NULL

EMPNO ENAME
---------- ----------
7839 KING


1 SELECT
2 empno
3 ,ename
4 FROM
5 (
6 SELECT
7 empno
8 ,ename
9 ,mgr
10 FROM
11 emp
12 ) iv_emp
13 WHERE
14* mgr IS NULL

EMPNO ENAME
---------- ----------
7839 KING

 

 

MySQL (8.0.36) インラインビューに表エイリアスを記述しないと見事にエラーになります。コーディング規約で書くこと!なんて明記しなくても、書かないとシンタックスエラーなので書き忘れて、あ”〜っということはないわけすw
MySQL 8.0 リファレンスマニュアル / SQL ステートメント / データ操作ステートメント / SELECT ステートメント / 13.2.10.2 JOIN 句 / table_subqueryに、”table_subquery は、FROM 句では導出テーブルまたはサブクエリーとも呼ばれます。 セクション13.2.11.8「導出テーブル」を参照してください。 このようなサブクエリーには、サブクエリーの結果にテーブル名を指定するエイリアスを含める必要があります。”と記載されています。

mysql> SELECT
-> empno
-> ,ename
-> FROM
-> (
-> SELECT
-> empno
-> ,ename
-> ,mgr
-> FROM
-> emp
-> )
-> WHERE
-> mgr IS NULL
-> ;
ERROR 1248 (42000): Every derived table must have its own alias


mysql> SELECT
-> empno
-> ,ename
-> FROM
-> (
-> SELECT
-> empno
-> ,ename
-> ,mgr
-> FROM
-> emp
-> ) iv_emp
-> WHERE
-> mgr IS NULL
-> ;
+-------+-------+
| empno | ename |
+-------+-------+
| 7839 | KING |
+-------+-------+
1 row in set (0.00 sec)


mysql> SELECT
-> /*+ NO_MERGE(iv_emp) */
-> empno
-> ,ename
-> FROM
-> (
-> SELECT
-> empno
-> ,ename
-> ,mgr
-> FROM
-> emp
-> ) iv_emp
-> WHERE
-> mgr IS NULL
-> ;
+-------+-------+
| empno | ename |
+-------+-------+
| 7839 | KING |
+-------+-------+
1 row in set (0.02 sec)

 

 

PostgreSQL (13.14) PostgreSQLもMySQLと同じ挙動ですね。
PostgreSQL 13.1文書 / 第7章 問い合わせ / 7.2. テーブル式 / 7.2.1. FROM句 / 7.2.1.3. 副問い合わせに、"7.2.1.3. 副問い合わせ 派生テーブルを指定する副問い合わせは括弧で囲む必要があります。 また、(7.2.1.2にあるように)必ずテーブル別名が割り当てられている必要があります。 例を示します。"とあります。

perftestdb=> SELECT
perftestdb-> empno
perftestdb-> ,ename
perftestdb-> FROM
perftestdb-> (
perftestdb(> SELECT
perftestdb(> empno
perftestdb(> ,ename
perftestdb(> ,mgr
perftestdb(> FROM
perftestdb(> emp
perftestdb(> )
perftestdb-> WHERE
perftestdb-> mgr IS NULL
perftestdb-> ;
ERROR: subquery in FROM must have an alias
行 5: (
^
HINT: For example, FROM (SELECT ...) [AS] foo.

perftestdb=> SELECT
perftestdb-> empno
perftestdb-> ,ename
perftestdb-> FROM
perftestdb-> (
perftestdb(> SELECT
perftestdb(> empno
perftestdb(> ,ename
perftestdb(> ,mgr
perftestdb(> FROM
perftestdb(> emp
perftestdb(> ) iv_emp
perftestdb-> WHERE
perftestdb-> mgr IS NULL
perftestdb-> ;
empno | ename
-------+-------
7839 | KING
(1 行)

 

実際、この手の癖に遭遇したOracle Databaseなど表エイリアス不要の世界の方々は、「おまえは、なにをいっているんだぁ〜」という感じで一瞬固まったあとに、あ〜〜〜〜っ! 、なるとは思いますけどw

 

ところで、最近のdown pour半端ない感じがします。私の子供の頃でも台風以外でみたことのないような集中的な豪雨が頻発しています。用心しても来るものはきてしまうわけですが、正しい情報を入手して早めに避難するなりしましょうね。と。実家近くの川の水位が落ち着いたのをみて安堵する。。。

 

Enjoy SQL! and 癖。

 

 

 

 



関連エントリー
標準はあるにはあるが癖の多いSQL 全部俺 #1 Pagination
標準はあるにはあるが癖の多いSQL 全部俺 #2 関数名は同じでも引数が逆の罠!
標準はあるにはあるが癖の多いSQL 全部俺 #3 データ型確認したい時あるんです
標準はあるにはあるが癖の多いSQL 全部俺 #4 リテラル値での除算の内部精度も違うのよ!
標準はあるにはあるが癖の多いSQL 全部俺 #5 和暦変換機能ある方が少数派
標準はあるにはあるが癖の多いSQL 全部俺 #6 時間厳守!
標準はあるにはあるが癖の多いSQL 全部俺 #7 期間リテラル!
標準はあるにはあるが癖の多いSQL 全部俺 #8 翌月末日って何日?
標準はあるにはあるが癖の多いSQL 全部俺 #9 部分文字列の扱いでも癖が出る><
標準はあるにはあるが癖の多いSQL 全部俺 #10 文字列連結の罠(有名なやつ)
標準はあるにはあるが癖の多いSQL 全部俺 #11 デュエル、じゃなくて、デュアル
標準はあるにはあるが癖の多いSQL 全部俺 #12 文字[列]探すにも癖がある
標準はあるにはあるが癖の多いSQL 全部俺 #13 あると便利ですが意外となかったり
標準はあるにはあるが癖の多いSQL 全部俺 #14 連番の集合を返すにも癖がある
標準はあるにはあるが癖の多いSQL 全部俺 #15 SQL command line client
標準はあるにはあるが癖の多いSQL 全部俺 #16 SQLのレントゲンを撮る方法
標準はあるにはあるが癖の多いSQL 全部俺 #17 その空白は許されないのか?
標準はあるにはあるが癖の多いSQL 全部俺 #18 (+)の外部結合は方言
標準はあるにはあるが癖の多いSQL 全部俺 #19 帰ってきた、部分文字列の扱いでも癖w
標準はあるにはあるが癖の多いSQL 全部俺 #20 結果セットを単一列に連結するにも癖がある
標準はあるにはあるが癖の多いSQL 全部俺 #21 演算結果にも癖がある
標準はあるにはあるが癖の多いSQL 全部俺 #22 集合演算にも癖がある
標準はあるにはあるが癖の多いSQL 全部俺 #23 複数行INSERTにも癖がある
標準はあるにはあるが癖の多いSQL 全部俺 #24 乱数作るにも癖がある
標準はあるにはあるが癖の多いSQL 全部俺 #25 SQL de Fractalsにも癖がある:)
標準はあるにはあるが癖の多いSQL 全部俺 おまけ SQL de 湯婆婆やるにも癖がでるw
帰ってきた! 標準はあるにはあるが癖の多いSQL #1 SQL de ROT13 やるにも癖が出るw
帰ってきた! 標準はあるにはあるが癖の多いSQL #2 Actual Plan取得中のキャンセルでも癖が出る
帰ってきた! 標準はあるにはあるが癖の多いSQL #3 オプティマイザの結合順評価テーブル数上限にも癖が出る
帰ってきた! 標準はあるにはあるが癖の多いSQL #4 Optimizer Traceの取得でも癖がでる
帰ってきた! 標準はあるにはあるが癖の多いSQL #5 - Optimizer Hint でも癖が多い
帰ってきた! 標準はあるにはあるが癖の多いSQL #6 - Hash Joinの結合ツリーにも癖がでる
帰ってきた! 標準はあるにはあるが癖の多いSQL #7 - Hash Joinの実行計画にも癖がでる
帰ってきた! 標準はあるにはあるが癖の多いSQL #8 - Hash Joinさせるにも癖が出る
帰ってきた! 標準はあるにはあるが癖の多いSQL #9、BOOLEAN型にも癖が出る
帰ってきた! 標準はあるにはあるが癖の多いSQL #10、BOOLEAN型にも癖が出る(後編)
帰ってきた! 標準はあるにはあるが癖の多いSQL #10、BOOLEAN型にも癖が出る(後編)の おまけ - SQL*PlusのautotraceでSQL Analysis Reportが出力される! (23ai〜)
帰ってきた! 標準はあるにはあるが癖の多いSQL #11 - 引用符にも癖がでるし、NULLのソート構文にも癖がある!(前編)
帰ってきた! 標準はあるにはあるが癖の多いSQL #12 - 引用符にも癖がでるし、NULLのソート構文にも癖がある!(後編)ー 列エイリアスの扱いにも癖がある!
帰ってきた! 標準はあるにはあるが癖の多いSQL #13 - コメント書くにも癖がある
帰ってきた! 標準はあるにはあるが癖の多いSQL #14 - コメントを書く位置にも癖がでる (SQL Clientにも癖がある)
帰ってきた! 標準はあるにはあるが癖の多いSQL #15 - 実行計画でスカラー副問合せの見せ方にも癖がでる

 

| |

コメント

コメントを書く