子查询中的order by子句returns错误结果

The order by clause returns wrong results in sub query

我的以下查询给出了错误的结果。我想以降序方式对 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

由于 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

有关获取前 n 个正确结果集的方法,请参见此处。另请注意 "What not to do" 部分,这正是您所做的。

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