如何确保我的结果集首先包含 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

其他提示

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

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

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

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

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

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

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

什么是棘手的订购问题?

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top