order by子句在子查询中返回错误的结果

时间:2015-01-26 15:25:16

标签: sql oracle sql-order-by rownum

我有以下查询给出了错误的结果。我想以递减的方式对PROCESS_START_DATE进行排序,以便在查询中始终获得最新的PROCESS_START_DATE。我在oracle中运行了上面的查询但它显示的输出不正确。我想按降序排列最新的PROCESS_CREATION_DATE。为此我写了有问题的查询。当我删除条件PROCESS_MONITOR.NAME ='WORKFLOWINENGINE1'时,它的运行绝对正常。但是当我使用这个条件时,我的查询无法生成正确的输出。我没有收到最新的PROCESS_CREATION_DATE

select * from(
select PROCESS_START_DATE
from PROCESS_MONITOR_STATISTIC JOIN PROCESS_MONITOR ON PROCESS_MONITOR.ID=PROCESS_MONITOR_STATISTIC.PROCESS_MONITOR_ID where PROCESS_MONITOR.NAME = 'WORKFLOWINENGINE1'
order by PROCESS_START_DATE desc)
where ROWNUM <= 1000

当我运行以下查询时,我得到了正确的结果。但只有当我使用连接条件时,我才得到预期的输出。

select * from 
(select PROCESS_START_DATE
    from PROCESS_MONITOR_STATISTIC
    order by PROCESS_START_DATE desc)
    where ROWNUM <=10

2 个答案:

答案 0 :(得分:2)

由于ORDER BY子句应用于子查询,而不是查询本身,因此外部查询的顺序将丢失。你需要两个ORDER BY条款

  • 使用ORDER BY
  • 选择正确的行需要内部ROWNUM
  • 需要外部ORDER BY以确保查询结果的顺序正确。

以下是应该有效的查询:

select * from(
    select PROCESS_START_DATE
    from PROCESS_MONITOR_STATISTIC
    JOIN PROCESS_MONITOR ON PROCESS_MONITOR.ID=PROCESS_MONITOR_STATISTIC.PROCESS_MONITOR_ID
    where PROCESS_MONITOR.NAME = 'WORKFLOWINENGINE1'
    order by PROCESS_START_DATE desc
) inner
where ROWNUM <= 1000
order by inner.PROCESS_START_DATE desc

答案 1 :(得分:0)

请参阅此处了解为top-n获取正确结果集的方法。另请注意“不该做什么”部分,这正是您所做的。

http://oracle-base.com/articles/misc/top-n-queries.php#mistake

相关问题