如果两个值相等,order by子句如何工作?

Abh*_*mar 10 sql sql-order-by oracle10g

这是我的NEWSPAPER表.

    National News   A   1
    Sports          D   1
    Editorials      A   12
    Business        E   1
    Weather         C   2
    Television      B   7
    Births          F   7
    Classified      F   8
    Modern Life     B   1
    Comics          C   4
    Movies          B   4
    Bridge          B   2
    Obituaries      F   6
    Doctor Is In    F   6
Run Code Online (Sandbox Code Playgroud)

当我运行此查询

select feature,section,page from NEWSPAPER
where section = 'F'
order by page;
Run Code Online (Sandbox Code Playgroud)

它给出了这个输出

Doctor Is In    F   6
Obituaries      F   6
Births          F   7
Classified      F   8
Run Code Online (Sandbox Code Playgroud)

但在Kevin Loney的Oracle 10g Complete Reference中输出就是这样的

Obituaries      F   6
Doctor Is In    F   6
Births          F   7
Classified      F   8
Run Code Online (Sandbox Code Playgroud)

请帮我理解它是怎么回事?

tas*_*wyn 8

如果您需要在子句的第一列中的两个值相同时进行可靠,可重现的排序ORDER BY,则应始终提供另一个辅助列以进行排序.虽然您可能会假设他们将根据输入的顺序(几乎总是根据我的知识,但要注意SQL标准没有指定任何形式的默认排序)或索引来排序自己,你永远不应该(除非它特别记录了你正在使用的引擎 - 即使那时我个人也从不依赖它.

如果您希望按页面内的功能按字母顺序排序,则您的查询应为:

select feature,section,page from NEWSPAPER
where section = 'F'
order by page, feature;
Run Code Online (Sandbox Code Playgroud)


Gor*_*off 8

在关系数据库中,表是集合并且是无序的.该order by子句主要用于输出目的(以及一些其他情况,例如包含子查询rownum).

这是一个很好的起点.SQL标准没有规定当a上的键order by相同时必须发生的事情.这是有充分理由的.可以使用不同的技术进行分类.有些可能是稳定的(保留原始顺序).有些方法可能不是.

关注相同的行是否在集合中,而不是它们的排序.顺便说一句,我认为这是一个不幸的例子.这本书的例子不应该含糊不清.

  • @Abhishekkumar...我的意思是标准允许数据库供应商在如何实现某些事情上留有余地,这是一件好事. (2认同)