Oracle union default sort is weird
The simple answer is....

To enforce an order in ANY resultset, not just your specific case, you have to use an order by clause.

The Oracle documentation spells it out clearly:


  Use the ORDER BY clause to order rows returned by the statement.
  Without an order_by_clause, no guarantee exists that the same query
  executed more than once will retrieve rows in the same order.