Подтвердить что ты не робот

Как я могу заказать записи в UNION без ORDER BY?

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

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

SELECT a FROM A LIMIT 1 
UNION 
SELECT b FROM B LIMIT 1;
4b9b3361

Ответ 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

Ответ 2

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

То, что я делал в прошлом для управления заказами в UNION,:

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

Ответ 3

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

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

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

Ответ 4

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

Какова сложная проблема упорядочивания?

Ответ 5

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

Ответ 6

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

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

Ответ 7

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