【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:美味)」みたいな場合にも使えます。
終わり。