UNION結果のソート

UNION結果をソートするときは order by 句には列名でなく位置を数値で指定すること。
う〜ん、そんなのすっかり忘れてましたよ。

リファレンスより

問合せ結果のソート

ORDER BY 句を使用して、問合せによって選択された行を順序付けます。位置のソートは次 のような場合に有効です。
  • 長いSELECT 構文のリストの式によって順序付けるためには、ORDER BY 句で全体の式を複製するのではなく、その位置を指定することができます。
  • 複合問合せ(集合演算子UNION、INTERSECT、MINUS またはUNION ALL を含む)では、ORDER BY 句に明示的な式ではなく、位置を使用する必要があります。またORDERBY 句は、最後のコンポーネントの問合せにのみ使用できます。ORDER BY 句は、複合問合せ全体によって戻されたすべての行を順序付けます。
ORDER BY 句による値のソートは、NLS_SORT 初期化パラメータによって明示的に指定するか、NLS_LANGUAGE 初期化パラメータによって暗黙的に指定します。ALTER SESSION 文を使用すると、ソート方法を1 つの言語ソート基準から別の言語ソート基準に動的に変更できます。ORDER BY 句のNLS_SORT パラメータとNLSSORT ファンクションを使用して、1 つの問合せに特定のソート基準を指定することもできます。

Visual Basic Tips
http://www.mitene.or.jp/~rnk/TIPS_ORCL_SELECT4.htmより

ORDER BY句により返される結果をソートする場合は、結果の列の名称ではなく列の位置を指定しなければなりません。以下に商品コード及び、仕入単価でソートする様子を示します。尚、最後のエラーの発生しているSQL文はORDER BY句に列名を指定したものを示しています。