【发布时间】: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