如何确保我的结果集首先a
和b
秒?这将有助于我解决一个棘手的订购问题。
以下是我正在做的简化示例:
SELECT a FROM A LIMIT 1
UNION
SELECT b FROM B LIMIT 1;
答案 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.