【问题标题】:Oracle 9.2 - Order By Ignored If Order By Columns Not FirstOracle 9.2 - 如果按列排序,则忽略按列排序
【发布时间】:2020-03-10 13:44:51
【问题描述】:

我是 Oracle SQL 的新手,最近发现如果我不在列表前面按列排序,则在创建临时表时,我的“Order By”语句会在 P/L SQL 脚本中被忽略的选择列。

即该语句返回一个无序的结果集,我的顺序被忽略(似乎实际上是按 A.ACCOUNT_ID 列排序 - 一个数字/整数唯一 ID)

SELECT
    A.ACCOUNT_ID,
    PRODUCT_CATEGORY,
    PRODUCT_NAME,
    PRICE,
    COST,
    QUANTITY
FROM
    TABLEA   A
    LEFT JOIN TABLEB   B ON A.ACCOUNT_ID = B.ACCOUNT_ID
ORDER BY
    PRODUCT_CATEGORY,
    PRODUCT_NAME

但这很好用,按预期和编写的方式对结果集进行排序

SELECT

    PRODUCT_CATEGORY,
    PRODUCT_NAME,
    A.ACCOUNT_ID,
    PRICE,
    COST,
    QUANTITY
FROM
    TABLEA   A
    LEFT JOIN TABLEB   B ON A.ACCOUNT_ID = B.ACCOUNT_ID
ORDER BY
    PRODUCT_CATEGORY,
    PRODUCT_NAME

任何想法为什么会发生这种情况?我记得在 SQL Server 中发生了类似的事情(即 CTE 会警告 'order by 在公用表表达式中被忽略或类似的东西) - 但在这种情况下没有 CTE - 我在这里的 end 语句示例出现在脚本的末尾它生成多个临时表,并在我希望结果集排序的地方构建最终临时表。

如果你们分享任何智慧,我将不胜感激。

谢谢!

【问题讨论】:

  • 请在您的问题中添加示例数据,以使您的问题可重现。
  • 请在每列前加上其表别名。您可能很清楚每列的来源,但对我们来说不是。
  • "...创建临时表时..." -- 表没有固有的行顺序。 ORDER BY 子句在那里没用。
  • “产生许多临时表”是什么意思? Oracle 临时表通常不像在 SQL Server 中那样动态创建,它们只创建一次并在脚本中填充——Oracle 没有本地临时表。 Oracle 9.2 也非常(非常)旧,并且如果不是第一个支持 LEFT JOIN 语法而不是使用旧的 (+) 运算符的 Oracle 版本之一。在旧版本的 Oracle 中使用新样式语法转换为旧样式语法时偶尔会出现优化器错误,因此如果您不是最新版本,您可以尝试使用旧语法并应用补丁集。
  • 一般来说,问题的答案是*“为什么我的数据库会做这种奇怪的事情?”原来是您的数据库没有做那件奇怪的事情,但是发生了一些您忽略或误解的事情。这绝对是这样的问题,因此需要一个可重现的测试用例。尽管如果效果真的是在 Oracle 9i R2 上运行的人工制品,那么测试用例将没有什么用处,因为我怀疑很少有人仍然可以访问这样一个旧版本的 RDBMS。

标签: sql oracle plsql sql-order-by oracle9i


【解决方案1】:

构建一个最终的临时表,我希望 排序的结果集

标准的 Oracle 表是一个堆组织的表,这意味着行的存储没有特定的顺序。

因此,除非您在选择行时明确使用 ORDER BY 子句,否则在返回行时永远不会保证排序。将数据存储在表中时,您无法控制排序。

来自甲骨文documentation:

heap-organized table

A table in which the data rows are stored in no particular order on disk. 
By default, CREATE TABLE creates a heap-organized table.

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2010-12-14
    • 2021-08-27
    • 1970-01-01
    相关资源
    最近更新 更多