Как я могу быть уверен, что мой набор результатов будет иметь a первое и b второе? Это помогло бы мне решить сложную проблему заказа.
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 исключит различные значения.
UNION
Я не могу найти никаких доказательств в документации, но из 10 лет опыта могу сказать, что UNION ALL сохраняет порядок, по крайней мере, в Oracle.
10
UNION ALL
Oracle
Однако не полагайтесь на это, если вы строите атомную станцию или что-то в этом роде.
Нет, порядок результатов в запросе SQL контролируется только предложением ORDER BY. Может случиться так, что в некоторых ситуациях вы видите упорядоченные результаты без предложения ORDER BY, но это случайно (например, побочный эффект текущего плана запросов оптимизатора) и не гарантируется.
В чем проблема сложного заказа?
Я знаю, что для Oracle нет способа гарантировать, что он выйдет первым без заказа. Проблема в том, что если вы попробуете это, оно может получиться в правильном порядке даже в большинстве случаев, когда вы его запускаете. Но как только вы положитесь на нее в процессе производства, она выйдет из строя.
Короткий ответ: да, вы получите A, затем B.
Я бы подумал, что нет, поскольку базе данных, скорее всего, потребуется выполнить ORDER BY для UNION.
UNION ALL может вести себя иначе, но YMMV.