エイリアスの実行順序
あけましておめでとうございます!アイサット研修担当です。
今年もよろしくおねがいいたします。
今年もよろしくおねがいいたします。
早速本題ですが、今回はSQLのエイリアスについてです。
以前こんなSQLを書いていました。ちなみにMySQLです。
SELECT aaa,bbb,ccc,
(SELECT ... ) as foo,
CASE
WHEN foo > 0 THEN "hoge"
ELSE "fuga"
END
FROM ...
サブクエリ文にエイリアスを使って名前をつけて、後ろのCASE文で使っている感じです。サブクエリ、CASE文ともにSELECT文中にあります。しかし、これはエラーになります。「unknown column」と出ました。どうやらfooというカラムがないよ、というもののようです。
fooありますけど!?となってしまいましたが、これはエイリアスの実行順序が影響しているようです。以下はSQLServerでの話ですが、マイクロソフトのHPにSELECTステートメントの論理的な処理順序として書いていますね。
- ①FROM
- ②ON
- ③JOIN
- ④WHERE
- ⑤GROUP BY
- ⑥WITH CUBE または WITH ROLLUP
- ⑦HAVING
- ⑧SELECT
- ⑨DISTINCT
- ⑩ORDER BY
- ⑪TOP
つまりSELECTでエイリアスをつけても、HAVING句では使えないのですね。MySQLだとGROUP BY句やHAVING句でも使えるそうなので、RDBによっては異なる部分もあるかと思いますが。
今回のケースは同じSELECT文の中ですが、うまくいきませんでした。SELECT文の中でも実行順序があるのでしょうね。
仕方なくCASE文の中に同じサブクエリを書きました。めちゃくちゃ長くなりました。非常によくないです。
テンポラリーテーブルなどを使うべきなのでしょうか。ちょっといい案考え中です。