如何在没有ORDER BY的情况下在UNION中订购条目?

时间:2009-03-04 15:01:32

标签: sql sql-order-by union

如何确保我的结果集首先ab秒?这将有助于我解决一个棘手的订购问题。

以下是我正在做的简化示例:

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

7 个答案:

答案 0 :(得分:35)

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

答案 1 :(得分:21)

我不认为订单是有保证的,至少不是所有DBMS。

我过去为控制UNION中的顺序所做的是:

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

答案 2 :(得分:4)

使用UNION的结果集将消除不同的值。

我在文档中找不到任何证据,但从10年经验我可以看出UNION ALL确实保留了顺序,至少在Oracle中。

但是,如果你正在建造一座核电站或类似的东西,请不要依赖它。

答案 3 :(得分:2)

不,ORDER BY子句控制SQL查询中的结果顺序。在某些情况下,您可能碰巧看到没有ORDER BY子句的有序结果,但这是偶然的(例如,优化器当前查询计划的副作用)并且无法保证。

什么是棘手的订购问题?

答案 4 :(得分:1)

我知道对于Oracle来说,没有办法保证在没有订单的情况下哪个会首先出现。问题是如果你尝试它,它可能会以正确的顺序出现,即使你运行它的大部分时间。但是一旦你在生产中依赖它,它就会出错。

答案 5 :(得分:0)

我原以为不会,因为数据库很可能需要为UNION做一个ORDER BY。

UNION ALL可能表现不同,但是YMMV。

答案 6 :(得分:-6)

简短的回答是肯定的,你会得到A然后是B.