我如何确定我的结果集会有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;
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
.
但是,如果您正在建造核电站或类似的东西,请不要依赖这个。
不,SQL 查询中的结果顺序仅由 ORDER BY 子句控制。在某些情况下,您可能碰巧看到没有 ORDER BY 子句的有序结果,但这是偶然的(例如,优化器当前查询计划的副作用)并且不能保证。
棘手的订购问题是什么?
我知道对于甲骨文来说,没有办法保证哪个会在没有订单的情况下先出来。问题是,如果您尝试它,即使在大多数情况下运行它,它也可能以正确的顺序出现。但是一旦你在生产中依赖它,它就会出错。
我本来不会想到的,因为数据库很可能需要为 UNION 执行 ORDER BY。
UNION ALL 的行为可能不同,但 YMMV。
简短的回答是肯定的,你会得到 A 然后 B。