Как я могу быть уверен, что мой результирующий набор будет иметь a первый и b второй? Это помогло бы мне решить сложную задачу упорядочения.
Вот упрощенный пример того, что я делаю:
SELECT a FROM A LIMIT 1
UNION
SELECT b FROM B LIMIT 1;
Ответ 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.