Как я могу заказать записи в UNION без ORDER BY? - PullRequest
20 голосов
/ 04 марта 2009

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

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

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

Ответы [ 7 ]

35 голосов
/ 04 марта 2009
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
21 голосов
/ 04 марта 2009

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

То, что я делал в прошлом, чтобы контролировать порядок в UNIONs:

(SELECT a, 0 AS Foo FROM A LIMIT 1)
UNION
(SELECT b, 1 AS Foo FROM B LIMIT 1)
ORDER BY Foo
4 голосов
/ 04 марта 2009

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

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

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

2 голосов
/ 04 марта 2009

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

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

1 голос
/ 04 марта 2009

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

0 голосов
/ 04 марта 2009

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

0 голосов
/ 04 марта 2009

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

UNION ALL может вести себя иначе, но YMMV.

...