※この備忘録は初学者の私が学習した内容を忘れないために書き起こしたものとなります。
#目的
UNION ALL と ORDER BY を使用して、並び替え済みのUNION ALL句を結合したい。
##例題
1組、2組、3組の生徒の生年月日情報の中から誕生日の昇順に並び替えて、
1998年生まれの人のみ表示したい
・1組の誕生日の一番早い人⇒1組の誕生日の一番遅い人
⇒2組の誕生日の一番早い人⇒2組の誕生日の一番遅い人
⇒3組の誕生日の一番早い人⇒3組の誕生日の一番遅い人
##誤答
単純に考えて、下記のようにUNION ALL句の中にORDER BYを使用するとエラーとなる。
SELECT *
FROM 1組
WHERE 誕生日 <= 19981231
ORDER BY 誕生日
UNION ALL
SELECT *
FROM 2組
WHERE 誕生日 <= 19981231
ORDER BY 誕生日
UNION ALL
SELECT *
FROM 3組
WHERE 誕生日 <= 19981231
ORDER BY 誕生日
##上手く表示できたコード
下記のようにサブクエリを使用するとうまくいった。
SELECT *
FROM (SELECT *
FROM 1組
ORDER BY 誕生日
WHERE 誕生日 <= 19981231
)
UNION ALL
SELECT *
FROM (SELECT *
FROM 2組
ORDER BY 誕生日
WHERE 誕生日 <= 19981231
)
UNION ALL
SELECT *
FROM (SELECT *
FROM 3組
ORDER BY 誕生日
WHERE 誕生日 <= 19981231
)
##感想
上記コードでうまく表示することができたが、なんとなく少し回りくどい表現なのかもしれないと思っている。
もっと勉強して、さらに簡潔なソースコードが記述できるようになったら、また改めてこの記事を更新したい。
自分と同じような初学者の方が、この記事にたどり着いて、少しでもヒントになってくれると嬉しく思うとともに、エンジニアの諸先輩方から「もっとこうした方がいいと思うよ!」といったアドバイスをいただけると大変ありがたいと思っています。