sql - Oracle SQL : Is ORDER BY non unique field deterministic?

标签 sql oracle oracle11g

假设我有一个观点 MYVIEW

COL1[CARCHAR2]    SORTINGCOL[NUMBER]
"itm1"            100
"itm2"            101
"itm3"            100

我查询以下语句
SELECT *
FROM MYVIEW
ORDER BY SORTINGCOL;

是吗保证 (=我可以依赖)返回的订单总是相同的?让我们说
  • item1 (值为 100)
  • item3 (值为 100)
  • item2 (值为 101)

  • 很明显item2将永远是最后一个,但是 item1 呢?和 item3SORTINGCOL值(value)?

    最佳答案

    不可以。一般的 SQL 尤其是 Oracle 不能保证稳定的排序。也就是说,您可以两次运行相同的查询并获得不同的排序——当键有联系时。

    这是因为 SQL 表(和结果集)表示无序集。因此,没有可以依靠的“自然”排序。通常,在 order by 中包含额外的键是个好主意。使排序稳定。

    编辑:

    我想再补充一个想法。您的示例用于查询中的整体排序,其中问题有点抽象——也就是说,任何给定的查询运行看起来都是正确的。窗口函数成为一个更大的问题。所以,有可能:

    select v.*, row_number() over (order by sortingcol) as col1,
           row_number() over (order by sortingcol desc) as col2
    from myview v
    

    会产生不一致的结果。在正常情况下,我们会期望 col1 + col2保持不变。但是,对于关系,情况往往并非如此。这会影响 row_number()keep .不影响rank()dense_rank()始终如一地处理关系。

    关于sql - Oracle SQL : Is ORDER BY non unique field deterministic?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34396818/

    相关文章:

    sql - 如何在MS Access中的SQL SELECT INTO语句中为新字段定义类型(int)

    mysql - 使用 group by 计算行数并显示所有行 MYSQL PHP

    php - 向 pgSQL 表添加权限问题

    MySQL,最好插入 NULL 或空字符串?

    oracle - 如何获取触发器中要执行ddl操作的表名

    sql - 如何使用 Groovy 从 Oracle 获取光标?

    oracle - 仅当存在时才删除触发器 (ORACLE)

    oracle,sql代码,这里不允许列

    sql - 如何在oracle中更新多行

    c++ - 在Qt中插入数据库