SQL:UNIONで結合するデータを、結合前のデータごとにソートする方法
UNIONを使ったときのソートでちょっと悩んだので記録しています。
photo credit: SQL file in Text editor via photopin (license)
colum1 | colum2 | sort_key |
---|---|---|
10000 | 0 | 1 |
10001 | 2 | 2 |
10002 | 1 | 3 |
10003 | 1 | 4 |
10004 | 0 | 5 |
colum1 | colum2 | sort_key |
---|---|---|
10000 | 0 | 1 |
10001 | 2 | 2 |
10004 | 0 | 5 |
10002 | 1 | 3 |
10003 | 1 | 4 |
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