На данный вопрос уже ответили:
У меня есть запрос:
SELECT '%' AS id_terminal
UNION
(SELECT DISTINCT
tr.id_terminal AS id_terminal
FROM...
ORDER BY tr.id_terminal ASC);
При этом подзапрос из второй части UNION:
SELECT DISTINCT
tr.id_terminal AS id_terminal
FROM...
ORDER BY tr.id_terminal ASC
возвращает упорядоченные данные, а общий запрос с UNION возвращает '%' и данные из результата этого запроса, но уже неупорядоченные. А почему UNION меняет порядок строк результата? Для UNION оптимизатор проводит свою сортировку? И можно ли в этом случае отменить использование этой оптимизации?
Согласно документации, для того, чтобы получить сортировку объединённого набора (и/или ограничение по количеству), необходимо все подзапросы обрамить скобками, а сортировку указать за пределами скобок.
(
SELECT '%' AS id_terminal
)
UNION ALL
(
SELECT DISTINCT tr.id_terminal AS id_terminal
FROM ...
)
ORDER BY id_terminal='%' DESC, id_terminal ASC;
При объединении наборов записей любой UNION (тем более UNION DISTINCT) имеет полное право начхать на сортировку в подзапросах ради эффективности выполнения операции объединения.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей