当我运行此查询时,结果未正确排序。
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,)时,一切正常。这有什么特别的原因吗?
答案 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;