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