Как я могу заказать записи в ПРОФСОЮЗЕ без ORDER BY?

StackOverflow https://stackoverflow.com/questions/610945

  •  03-07-2019
  •  | 
  •  

Вопрос

Как я могу быть уверен, что мой результирующий набор будет иметь a первый и b второй?Это помогло бы мне решить сложную проблему с заказом.

Вот упрощенный пример того, что я делаю:

SELECT a FROM A LIMIT 1 
UNION 
SELECT b FROM B LIMIT 1;
Это было полезно?

Решение

SELECT col
FROM 
   (
       SELECT a col, 0 ordinal FROM A LIMIT 1
       UNION ALL
       SELECT b, 1 FROM B LIMIT 1
   ) t
ORDER BY ordinal

Другие советы

Я не думаю, что порядок гарантирован, по крайней мере, не во всех СУБД.

В прошлом я управлял порядком в UNIONs:

(SELECT a, 0 AS Foo FROM A LIMIT 1)
UNION
(SELECT b, 1 AS Foo FROM B LIMIT 1)
ORDER BY Foo

Ваш результирующий набор с помощью UNION устранит различные значения.

Я не могу найти никаких доказательств в документации, но из 10 по многолетнему опыту я могу сказать, что UNION ALL сохраняет порядок, по крайней мере, в Oracle.

Однако не полагайтесь на это, если вы строите атомную станцию или что-то в этом роде.

Нет, порядок результатов в запросе SQL контролируется только предложением ORDER BY. Может случиться так, что в некоторых ситуациях вы видите упорядоченные результаты без предложения ORDER BY, но это случайно (например, побочный эффект текущего плана запросов оптимизатора) и не гарантируется.

В чем проблема сложного заказа?

Я знаю, что для Oracle нет способа гарантировать, что он выйдет первым без заказа. Проблема в том, что если вы попробуете это, оно может получиться в правильном порядке даже в большинстве случаев, когда вы его запускаете. Но как только вы положитесь на нее в процессе производства, она выйдет из строя.

Я бы подумал, что нет, поскольку базе данных, скорее всего, нужно будет выполнить ORDER BY для UNION.

UNION ALL может вести себя по-разному, но YMMV.

Короткий ответ: да, вы получите A, а затем B.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top