Как я могу быть уверен, что в моем наборе результатов будет a
первым и b
вторым? Это помогло бы мне решить сложную проблему с заказом.
Вот упрощенный пример того, что я делаю:
SELECT a FROM A LIMIT 1
UNION
SELECT b FROM B LIMIT 1;
Как я могу быть уверен, что в моем наборе результатов будет a
первым и b
вторым? Это помогло бы мне решить сложную проблему с заказом.
Вот упрощенный пример того, что я делаю:
SELECT a FROM A LIMIT 1
UNION
SELECT b FROM B LIMIT 1;
Я не думаю, что порядок гарантирован, по крайней мере, не во всех СУБД.
То, что я сделал в прошлом, чтобы контролировать порядок в UNION:
(SELECT a, 0 AS Foo FROM A LIMIT 1)
UNION
(SELECT b, 1 AS Foo FROM B LIMIT 1)
ORDER BY Foo
ORDER BY
применяется ко всему UNION, а не ко второй части. Со скобками или без них и во всех 3-х СУБД: Postgres, SQL Server, MySQL. Единственный способ применить его во 2-й части — это использовать вот такие скобки: SELECT ...) UNION (SELECT ...ORDER BY);
Но это не значит, что результат будет упорядочен. UNUON не обязательно сохраняет порядок внутренних подзапросов.
- person ypercubeᵀᴹ; 30.09.2016
Ваш результирующий набор с UNION
устранит различные значения.
Я не могу найти никаких доказательств в документации, но из 10
лет опыта я могу сказать, что UNION ALL
сохраняет порядок, по крайней мере, в Oracle
.
Однако не полагайтесь на это, если вы строите атомную электростанцию или что-то в этом роде.
Нет, порядок результатов в SQL-запросе определяется только предложением ORDER BY. Возможно, в какой-то ситуации вы увидите упорядоченные результаты без предложения ORDER BY, но это случайно (например, побочный эффект текущего плана запроса оптимизатора) и не гарантируется.
В чем сложность заказа?
Я знаю, что для Oracle нет способа гарантировать, что выйдет первым без заказа. Проблема в том, что если вы попробуете это, он может получиться в правильном порядке даже в большинстве случаев, когда вы его запускаете. Но как только вы будете полагаться на него в продакшене, он выйдет неверным.
Я бы подумал, что нет, поскольку базе данных, скорее всего, потребуется выполнить ORDER BY для UNION.
UNION ALL может вести себя иначе, но YMMV.
Короткий ответ: да, вы получите А, а затем Б.