Это может быть более ясный способ решения проблемы:
select *
from station
where len(city) in (
select max(len(city)) from station
union
select min(len(city)) from station
)
order by len(city), city
Вы можете иметь заказ в подзапросе, если этот запрос использует top, но вы не можете иметь шаблон:
select * from x order by a
union
select * from y order by a
Хотя вам разрешено:
select * from x
union
select * from y
order by a
Порядок в этом случае выполняется после объединения и упорядочивает весь объединенный набор, как если бы это было:
select * from (
select * from x
union
select * from y
) z
order by a
Нет концепции сделать первый выбор из x, упорядочить его, сделать выбор из y, упорядочить его, затем объединить два набора упорядоченных результатов вместе, если вы специально не используете скобки, чтобы превратить их в субзапросы (и даже тогда, только если они используют TOP) согласно некоторым другим ответам. Как представлено в форме "x union y", в конце SQL должен быть только один порядок по заявке, и он применяется ко всему набору. Причина, по которой сервер sql суетится по этому поводу «не может иметь порядок в середине оператора» (оракул не), заключается в том, что порядок строк, выходящих из операции [union], не гарантирован, поэтому он не 'Заказывать их по пути не имеет смысла - это пустая трата времени и ресурсов. Общее правило: «если вы хотите, чтобы ваши строки были в определенном порядке, это должно быть последним, что вы делаете», и, следовательно, любые промежуточные этапы упорядочения являются пустой тратой. Вы могли бы утверждать, что этот вариант использования должен быть разрешен, и я бы нашел его действительным аргументом, равным образом допустимым, как, скажем, "top без order by не должен быть разрешен, пока он есть"Если вы покопаетесь в ней / спросите команду sql в ms, вы, вероятно, обнаружите, что работа по синтаксическому анализу sql достаточно сложна, и они остановились на «нет порядка в середине инструкции», не добавив еще одно правило «, если это неверхняя операция "