Нельзя использовать ORDER BY в подзапросе, связанном с операторами UNION, UNION ALL, MINUS или INTERSECT
В обоих подзапросах UNION ALL
используется ORDER BY
что недопустимо (см. здесь, https://docs.oracle.com/database/121/SQLRF/queries004.htm#SQLRF52341).
Я бы просто бросил эти подзапросы (или блоки запросов) в обычные табличные выражения и выполнял там вашу работу.
Общее табличное выражение разрешает использование:
-заказа
-ограничивающего предложения
Я использовал нижеприведенную схему HR-инструкций.
В среде 11G, как заявляли Гордон Линофф и др., Ограничивающие строки пункты не существовали. Вы бы сделали что-то вроде этого:
WITH stations AS (
SELECT
ROW_NUMBER() OVER(ORDER BY length(city), city) rn,
length(city) city_length,
city
FROM
locations
)
SELECT
*
FROM
stations
WHERE
rn <= 1
UNION ALL
SELECT
*
FROM
stations
WHERE
rn >= (SELECT MAX(rn) FROM stations)
ORDER BY
1
В среде после 11G вы бы использовали возможности предложения ограничения строк:
WITH stations_desc AS (
SELECT
length(city),
city
FROM
locations stations
ORDER BY
length(city) DESC,
city
FETCH FIRST 1 ROWS ONLY
), stations_asc AS (
SELECT
length(city),
city
FROM
locations stations
ORDER BY
length(city) ASC,
city
FETCH FIRST 1 ROWS ONLY
)
SELECT
*
FROM
stations_asc
UNION ALL
SELECT
*
FROM
stations_desc;
LENGTH(CITY) CITY
-----------------------
4 Bern
19 South San Francisco
Это приведет к результатам, которые вы пытаетесь достижения.
Кстати, синтаксис предложения ограничения строки следующий в Oracle 12 c:
[ OFFSET offset { ROW | ROWS } ]
[ FETCH { FIRST | NEXT } [ { rowcount | percent PERCENT } ]
{ ROW | ROWS } { ONLY | WITH TIES } ]
Вы пропустили сегмент, { ONLY | WITH TIES } ]