エイリアスの実行順序

あけましておめでとうございます!アイサット研修担当です。
今年もよろしくおねがいいたします。

早速本題ですが、今回は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ステートメントの論理的な処理順序として書いていますね。

  1. ①FROM
  2. ②ON
  3. ③JOIN
  4. ④WHERE
  5. ⑤GROUP BY
  6. ⑥WITH CUBE または WITH ROLLUP
  7. ⑦HAVING
  8. ⑧SELECT
  9. ⑨DISTINCT
  10. ⑩ORDER BY
  11. ⑪TOP

つまりSELECTでエイリアスをつけても、HAVING句では使えないのですね。MySQLだとGROUP BY句やHAVING句でも使えるそうなので、RDBによっては異なる部分もあるかと思いますが。

今回のケースは同じSELECT文の中ですが、うまくいきませんでした。SELECT文の中でも実行順序があるのでしょうね。
仕方なくCASE文の中に同じサブクエリを書きました。めちゃくちゃ長くなりました。非常によくないです。
テンポラリーテーブルなどを使うべきなのでしょうか。ちょっといい案考え中です。

ブログ

前の記事

自己肯定での締めくくり
ブログ

次の記事

Let’s世直し