当两次使用同一列时,Oracle没有正确排序

时间:2014-05-13 15:00:04

标签: database oracle sorting date

当我运行此查询时,结果未正确排序。

SELECT 
  SYSDATE - datecolumn a,
  SYSDATE - datecolumn sortcolumn
FROM atable
ORDER BY sortcolumn

产地:

2576.780243055555555555555555555555555556
2586.297013888888888888888888888888888889
2342.294479166666666666666666666666666667
2617.297476851851851851851851851851851852
2624.855104166666666666666666666666666667
2624.855138888888888888888888888888888889
2624.854236111111111111111111111111111111
2372.296643518518518518518518518518518519
2645.257800925925925925925925925925925926
2403.294756944444444444444444444444444444
2676.297696759259259259259259259259259259

当删除第一行(SYSDATE - datecolumn a,)时,一切正常。这有什么特别的原因吗?

2 个答案:

答案 0 :(得分:4)

这似乎是一个错误。这种行为看起来类似于bug 8675087,据推测它在11.2.0.2中修复 - 实际上我无法重现测试用例。但是我仍然看到你在那个版本(SQL Fiddle)和11.2.0.3中的行为,所以这是相似但不完全一样......

如果这导致您遇到真正的问题并且您找不到您感到满意的解决方法(例如交换列顺序;如果您的sortcolumn是第一个使用sysdate的表达式,似乎没问题,但在真实查询中交换列可能不方便)然后你应该用Oracle提出服务请求。

答案 1 :(得分:1)

引人入胜的错误。转载于11.2.0.2。

如果查询包含在子查询中,甚至会发生:

select * from (
  select sysdate - db_created_on a
        ,sysdate - db_created_on b
  from members
) order by b;

(结果未正确排序)

select * from (
  select sysdate - db_created_on a
        ,sysdate - db_created_on b
  from members
) order by a;

(结果正确排序)

我能想到的最佳解决方法是使用标量子查询进行SYSDATE,这似乎可以使其正确排序:

select sysdate - db_created_on a
      ,(select sysdate from dual) - db_created_on b
from members
order by b;