8

在 SELECT 查询中包含 DISTINCT 是否意味着应该对结果集进行排序?

我认为没有,但我正在寻找一个权威的答案(网络链接)。

我有这样的查询:

Select Distinct foo
From Bar

在 oracle 中,结果是不同的,但不是按排序顺序排列的。在 Jet/MS-Access 中,似乎需要做一些额外的工作来确保对结果进行排序。我假设 oracle 在这种情况下遵循规范,而 MS Access 正在超越。

另外,有没有办法可以给表格一个提示它应该排序foo(除非另有说明)?

4

10 回答 10

6

SQL92 规范

如果指定了 DISTINCT,则令 TXA 为从 TX 中消除冗余重复值的结果。否则,令 TXA 为 TX。

...

4) 如果未指定 an,则 Q 的行的顺序取决于实现。

最终真正的答案是 DISTINCT 和 ORDER BY 是 SQL 语句的两个独立部分;如果您没有 ORDER BY 子句,则不会按定义对结果进行专门排序。

于 2009-03-27T22:41:20.227 回答
5

不会。在许多情况下,Oracle 中的 DISTINCT 并不意味着排序,其中最重要的是 10g+ 中用于 group by 和 distinct 操作的散列算法。

如果您想要一个有序的结果集,请始终指定 ORDER BY,即使在 9i 及以下版本中也是如此。

于 2009-03-28T03:10:08.520 回答
3

没有“权威”的答案链接,因为这是没有 SQL 服务器保证的。

当使用 distinct 作为查找这些结果的最佳方法的副作用时,您通常会按顺序看到结果。但是,任何数量的其他事情都可能混淆结果,并且某些服务器可能会以不给它们排序的方式交回结果,即使它必须排序才能获得结果。

底线:如果你的服务器不能保证你不应该指望它。

于 2009-03-27T21:52:28.627 回答
1

不,这并不意味着排序。根据我的经验,它按已知索引排序,可能恰好是 foo。

为什么要微妙?为什么不从 foo 的 Bar Order 中具体选择 Distinct foo?

于 2009-03-27T21:44:15.450 回答
1

据我所知,没有。我能想到的唯一原因是 SQL Server 会在内部对数据进行排序以检测和过滤掉重复项,从而以“预先排序”的方式返回它。但我不会依赖那个“副作用”:-)

于 2009-03-27T21:44:43.233 回答
0

在我使用过的至少一台服务器上(大约六年前,可能是 Oracle 或 SQL Server),如果您没有 ORDER BY 子句,则 SELECT DISTINCT 会被拒绝。它在“其他”服务器(Oracle 或 SQL Server)上被接受。你的旅费可能会改变。

于 2009-03-27T21:44:51.313 回答
0

不,结果未排序。如果你想给它一个“提示”,你当然可以提供一个 ORDER BY:

从 bar order by foo 中选择不同的 foo

但请记住,您可能想要的不仅仅是按字母顺序排序。相反,您可能希望根据其他字段的标准进行排序。看:

http://weblogs.sqlteam.com/jeffs/archive/2007/12/13/select-distinct-order-by-error.aspx

于 2009-03-27T21:50:17.120 回答
0

正如大多数答案所说,DISTINCT 不强制要求排序 - 只有 ORDER BY 强制要求。但是,获得 DISTINCT 结果的一种标准方法是排序;另一种是散列值(这往往会导致半随机排序)。依靠 DISTINCT 的排序效果是愚蠢的。

于 2009-03-29T05:16:30.457 回答
0

在我的情况下(SQL 服务器),作为一个例子,我有一个国家列表,每个国家都分配了一个数值 X。当我按 X 执行 select distinct * from Table order 时,它按 X 排序,但同时结果集国家也被排序,这不是直接实现的。根据我的经验,我会说 distinct 确实意味着隐式排序。

于 2016-04-26T19:59:09.023 回答
-1

是的。Oracle确实使用排序来计算不同的。如果你看一下解释计划,你就会看到。它对该计算进行排序这一事实绝不意味着结果集将被排序。如果要对结果集进行排序,则需要使用 ORDER BY 子句。

于 2009-03-27T23:55:41.017 回答