UNION ALLで2つのクエリを連結した場合、
原則1つ目のクエリの列名称が採用されます。
つまり、
SQL
1SELECT
2 A.HOGE
3, A.FUGA
4FROM
5 Aテーブル A
6UNION ALL
7SELECT
8 B.COL1
9, NULL
10FROM
11 Bテーブル B
の場合返却される列名は、
HOGE、FUGAとなります。
このようなケースで列別名をつける際は、
HOGE、FUGA側の方で列別名を指定すると良いでしょう。
###追記
カラム数が異常に多かったり、
擬似的に作成したNULLを返すカラムが多いケースでは、
可読性、保守性の観点から列別名を明示するのは有用です。
前のサンプルを使うと以下のイメージ
SQL
1SELECT
2 A.HOGE AS "ヤック"
3, A.FUGA AS "デカルチャー"
4FROM
5 Aテーブル A
6UNION ALL
7SELECT
8 B.COL1 AS "ヤック"
9, NULL AS "デカルチャー"
10FROM
11 Bテーブル B
ちなみにUNION ALL以外も、
UNION、EXCEPT(OracleはMINUS)、INTERSECTなどの、
集合演算子の列名については全て同じような振る舞いとなります。
###集合演算子利用時の列別名利用について
コメントが長くなりそうだったのでこちらで。
まだまだ半人前の僕の短い経験上ですが、
UNIONなどの集合演算子を利用するシーンで、
後者(2つ目)のクエリにのみ別名をつけるケースは、
あまり見かけた覚えがありません(もしかしたら普通によく使われてるかも)。
パターンとしては以下の3パターンが多い気がします。
0. 前者のクエリだけ別名を明示する
0. 前者、後者ともに別名を明示する
0. そもそも別名を付けない
1つ目のパターンは、
そもそも1つ目のカラム名に合わせて結果セットの列名が決まるのだから、
2つ目の別名指定は冗長という考え方に基づくと思われます。
2つ目のパターンは、
いやいやぱっと見で前者と後者の対応が分からないのはけしからんでしょとか、
後から修正する際にカラム名揃ってないとエディタのキーワード検索で引っかからないじゃんとか、
可読性と保守性を重視した考え方に基づくと思います。
3つ目のパターンは、
1つ目のクエリのテーブル列名から一切変える必要もないので、
わざわざ記載するだけ冗長という考え方に基づくと思われます。
特に多いのは1つ目、2つ目の書き方だと思うのですが、
その理由としてはそもそもUNIONなどの集合演算子の性質とか利用目的を考えてもらうと分かるかもしれません。
UNIONなどでレコードをくっつけるケースというのは、
テーブルは異なるけど構造などが共通しているものを、
まとめて取得したいという目的が多いと思います。
こう例えると誤りもあるかもですが、
UNIONで束ねて取得することは、
オブジェクト指向でいう所の、
特化(派生クラス)・汎化(基底クラス)の関係を再現しているとも言える部分があります。
例えばサンプルして掲示されたSQLでは、
野菜、フルーツ、お菓子というテーブルというか、
食べ物区分による分類がありますよね。
これらをUNIONで束ねて名称を取得したい場合、
列別名を指定しないとカラム名が野菜名となってるのにもかかわらず、
その中にはフルーツ名・お菓子名も入ってますという事態になります。
そこでUNIONで束ねたものは、
名称については野菜名じゃなく別名で食物名にしましょうとか、
より一般化した列別名を付けることが多いです。
(元々全部のカラムがNAMEとかだったら汎化しようにないですがw)
そういった事情もあり、
上記1つ目、2つ目の別名の振り方が多いのかなと個人的には思ってます。
(テーブル設計でも実はスーパタイプ、サブタイプというオブジェクト指向的な切り口の考え方がありますが、
蛇足が過ぎるので割愛します。)
……と長々と語りはしましたが、
結局は列別名の振り方とかも個人の好みの問題の側面が強いのでご自身がやりやすいように、
そして他の方が後々メンテナンスする際に分かりにくくならないように、
上記を意識して取り組むと他者が見てケチが付けられにくいコーディングが出来るようになってくるでしょう。
僕自身も修行中の身ではありますので、偉そうにし過ぎ感MAXですが。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/02 23:22
2016/08/02 23:26 編集
2016/08/03 11:03 編集
2016/08/03 12:10
2016/08/03 13:06