SELECT DISTINCT是否意味着某种结果

时间:2009-03-27 21:39:30

标签: sql oracle sqlplus

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

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

我有这样的查询:

Select Distinct foo
From Bar

在oracle中,结果是截然不同的,但不按排序顺序排列。在Jet / MS-Access中,似乎还有一些额外的工作要确保结果是排序的。我假设oracle在这种情况下遵循规范并且MS Access已经超越了。

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

10 个答案:

答案 0 :(得分:5)

来自SQL92 specification

  

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

...

  

4)如果未指定a,则Q行的排序依赖于实现。

最终真正的答案是DISTINCT和ORDER BY是SQL语句的两个独立部分;如果您没有ORDER BY子句,则根据定义的结果将不会被特别排序。

答案 1 :(得分:5)

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

如果你想要一个有序的结果集,

总是指定ORDER BY,即使在9i及以下也是如此。

答案 2 :(得分:3)

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

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

底线:如果您的服务器不保证您不应该依赖它。

答案 3 :(得分:1)

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

为什么要微妙?为什么不通过foo从Bar Order中选择Distinct foo?

答案 4 :(得分:1)

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

答案 5 :(得分:1)

在我的案例中(SQL服务器),作为一个例子,我有一个国家列表,每个国家都有一个数值X。当我通过X从表顺序中选择不同的*时,它按X排序,但同时也订购了未直接实现的结果集国家/地区。 根据我的经验,我会说,不同意味着隐含的类别。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

选择不同的foo 从酒吧 按foo排序

但请记住,您可能希望按字母顺序排序。相反,您可能希望对其他字段的条件进行排序。参见:

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

答案 8 :(得分:0)

正如答案主要说的那样,DISTINCT并没有强制要求排序 - 只有ORDER BY强制要求。但是,实现DISTINCT结果的一种标准方法是排序;另一种是散列值(这往往会导致半随机排序)。依靠DISTINCT的排序效果是愚蠢的。

答案 9 :(得分:-1)

是。 Oracle确实使用排序来计算不同的。如果你看一下解释计划,你可以看到。它对计算进行了某种程度的事实并不意味着什么 结果集将被排序。如果希望对结果集进行排序,则需要使用ORDER BY子句。