UNION меняет порядок строк [дубликат]

217
05 мая 2018, 17:09

На данный вопрос уже ответили:

  • Почему ORDER BY не срабатывает при использовании UNION в mysql? 5 ответов

У меня есть запрос:

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 оптимизатор проводит свою сортировку? И можно ли в этом случае отменить использование этой оптимизации?

Answer 1

Согласно документации, для того, чтобы получить сортировку объединённого набора (и/или ограничение по количеству), необходимо все подзапросы обрамить скобками, а сортировку указать за пределами скобок.

(
    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) имеет полное право начхать на сортировку в подзапросах ради эффективности выполнения операции объединения.

READ ALSO
c++ public static class cli

c++ public static class cli

необходимо реализовать статический публичный класс с аналогичным элементом List в вижл с++ вот код шарпа http://prntscrcom/jd7zk7, хелп

254
Захват аргументов

Захват аргументов

Имеется класс Description, и его конструктор:

248
Считывание памяти процесса (ReadProcessMemory) | C++

Считывание памяти процесса (ReadProcessMemory) | C++

Написал небольшую функцию для чтение памяти процесса, но при её срабатывании, программа над которой проводятся опыты вылетаетЧто я делаю...

205
Стиль директивы #include

Стиль директивы #include

Сегодня был спор с коллегамиПредметом стала такая строка:

202