2

我正在尝试从今天的日期开始从表中返回 7 个事件,并将它们按日期顺序排列:

SELECT ID
FROM table
 where ID in (select ID from table
where DATEFIELD >= trunc(sysdate)
order by DATEFIELD ASC)
and rownum <= 7

如果我删除了“order by”,它会很好地返回 ID,并且查询可以正常工作,但它的顺序不正确。将不胜感激任何帮助,因为我似乎无法弄清楚我做错了什么!

(编辑)为澄清起见,我之前使用过这个,返回的订单真的很糟糕:

select ID
from TABLE
where DATEFIELD >= trunc(sysdate)
and rownum <= 7
order by DATEFIELD 

谢谢

4

4 回答 4

10

ROWNUM“函数”的值在处理 ORDER BY之前应用。这就是为什么它不能按照您使用的方式工作(有关类似说明,请参阅手册)

当使用限制查询ROWNUM并涉及 ORDER BY 时,必须在内部选择中进行排序,并且必须在外部选择中应用限制:

select *
from (
  select *
  from table
  where datefield >= trunc(sysdate)
  order by datefield ASC
)
where rownum <= 7
于 2012-08-09T11:22:41.680 回答
3
  1. 您不能order bywhere id in (select id from ...)子查询中使用。反正也没有意义。此条件仅检查是否id在子查询中。如果它影响输出的顺序,那只是偶然的。不同的数据查询执行计划可能不同,输出顺序也会不同。order by在主查询末尾使用显式。

  2. 众所周知,Oracle 的“功能”rownumorder by. 有关详细信息,请参阅http://www.adp-gmbh.ch/ora/sql/examples/first_rows.html。在你的情况下,你应该使用类似的东西:

    SELECT ID
    FROM (select ID, row_number() over (order by DATEFIELD ) r
        from table
        where DATEFIELD >= trunc(sysdate))
    WHERE r <= 7
    

也可以看看:

另请参阅关于 SO 的其他类似问题,例如:

于 2012-08-09T11:31:39.323 回答
1

您的外部查询无法“看到”内部查询中的 ORDER,在这种情况下,内部查询中的顺序没有意义,因为它(内部)仅用于创建将在 WHERE 上使用的数据子集外部的,所以这个子集的顺序无关紧要。

也许如果你能更好地解释你想做什么,我们可以帮助你

于 2012-08-09T11:28:13.340 回答
0

ORDER BY CLAUSE IN Subqueries:子查询中不允许使用 order by 子句,内联视图除外。如果尝试包含 ORDER BY 子句,您会收到错误消息

内联视图是对 from 子句的查询。

SELECT t.* FROM (SELECT id, name FROM student) t

于 2017-02-02T20:29:54.340 回答