16bit!

エンジニアじゃなくなっちゃった人が何かを書くブログ

【SQL】UNIONした結果を非表示項目でソートする

"UNION"や"UNION ALL"を使って2つ以上のビューをまとめて1つの結果として抽出する場合に、
結果には表示しない項目でソートをかけたいとする。

文章だと何言ってるかわからないので、例としては以下みたいな感じ。

例題

・kudamonoテーブル

名前 値段 美味しさ
りんご 150 2
ぶどう 300 4
もも 400 5
みかん 50 3

・yasaiテーブル

名前 値段 美味しさ
きゃべつ 300 1
じゃがいも 100 2
こまつな 100 3
もやし 20 4

上記2つのテーブルをUNIONして、美味しさが高い順(同じ場合は値段が安い順)にソートする。
ただし、結果には美味しさは表示しない

・欲しい結果

名前 値段
もも 400
もやし 20
ぶどう 300
みかん 50
こまつな 100
じゃがいも 100
りんご 150
きゃべつ 300
SQL

UNIONした結果に対してソートをかける場合は、
たとえ各ビューが同一名称のカラムを持っていたとしても、それをselect内に書かないとソート項目としては使えません。
つまり、下記のようなSQLは使えないということ。

select 名前,値段
from kudamono
union all
select 名前,値段
from yasai
order by 美味しさ desc,値段

じゃあどうすればいいかというと、面倒臭いですが、美味しさを取得するSQLをビューにして、
それをさらにselectで囲ってしまうといけます。

select 名前,値段
from
  (select 名前,値段,美味しさ
   from kudamono
   union all
   select 名前,値段,美味しさ
   from yasai)
order by 美味しさ desc,値段

簡単ですが、取得項目が多い時はちょっと面倒臭いですね。

ちなみに非表示カラムだけじゃなくて、例えば「美味しさは数値ではなく、文字列に置き換えて表示したい(1:まずい~5:美味)」みたいな場合にも使えます。


終わり。