ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

SQL:UNIONで結合するデータを、結合前のデータごとにソートする方法

UNIONを使ったときのソートでちょっと悩んだので記録しています。

f:id:AJYA:20151001125840j:plain
photo credit: SQL file in Text editor via photopin (license)

colum1colum2sort_key
1000001
1000122
1000213
1000314
1000405
というデータを
colum1colum2sort_key
1000001
1000122
1000405
1000213
1000314
というように、colum2の値で分けてそれぞれで並べ替えたい場合、

SELECT colum1, colum2, sort_key FROM m_resource WHERE colum2 <> 1 ORDER BY sort_key
UNION ALL
SELECT colum1, colum2, sort_key FROM m_resource WHERE colum2 = 1 ORDER BY sort_key

ではエラーになりました。

次に

SELECT colum1, colum2, sort_key FROM m_resource WHERE colum2 <> 1 
UNION ALL
SELECT colum1, colum2, sort_key FROM m_resource WHERE colum2 = 1 
ORDER BY sort_key

とすると、UNIONで取り出したデータに対してソートされるので、最初の表と同じ結果となります。

いろいろ試した結果、以下のようにcolum2の値で分けて検索した結果にソート用の値を追加することで思ったとおりソートできるようになりました。

SELECT colum1, colum2, sort_key, 1 AS sort_key2 FROM m_resource WHERE colum2 <> 1
UNION ALL
SELECT colum1, colum2, sort_key, 2 AS sort_key2 FROM m_resource WHERE colum2 = 1
ORDER BY sort_key2, sort_key