Следующий запрос отлично подходит для почти каждой базы данных (дайте или возьмите таблицу фиктивных dual
), включая Oracle:
select 'A' as x from dual union all
select 'B' from dual
order by x asc
Возврат:
| X |
|---|
| A |
| B |
Теперь этот запрос по-прежнему является стандартным SQL, но не работает в Oracle
select 'A' as x from dual union all
select 'B' from dual union all
select 'C' from dual
order by x asc
Я получаю
ORA-00904: "X": invalid identifier
Это, однако, работает:
select 'A' as x from dual union all
select 'B' as x from dual union all
select 'C' from dual
order by x asc
Я играл с этой проблемой и выяснил, что, по-видимому, по крайней мере, первый подзапрос и второй-последний (??) подселек должны иметь столбец с именем x
. В первом примере два подзаголовка, казалось, просто совпадали. Рабочий пример:
select 'A' as x from dual union all
select 'B' from dual union all
select 'C' from dual union all
select 'D' from dual union all
select 'E' from dual union all
select 'F' as x from dual union all
select 'G' from dual
order by x asc
Как вы, возможно, догадались, этот не будет работать:
select 'A' as x from dual union all
select 'B' from dual union all
select 'C' from dual union all
select 'D' from dual union all
select 'E' as x from dual union all
select 'F' from dual union all
select 'G' from dual
order by x asc
Интересная заметка:
Производные таблицы, похоже, не страдают от этого ограничения. Это работает:
select * from (
select 'A' as x from dual union all
select 'B' from dual union all
select 'C' from dual
)
order by x asc
Вопрос:
Является ли это (известной?) ошибкой в синтаксисе Oracle SQL или имеется очень тонкая деталь в синтаксисе языка, которая абсолютно требует, чтобы первый и второй-последний подзаголовки содержали столбец имени, как указано на ORDER BY
?