我正试图从今天的日期开始从表中返回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
由于
答案 0 :(得分:10)
在处理ORDER BY之前应用 {<1>}“函数”的值。这就是为什么它不能像你使用它一样工作(See the manual用于类似的解释)
当使用ROWNUM
限制查询并且涉及ORDER BY时,必须在内部选择中完成排序,并且必须在外部选择中应用限制:
ROWNUM
答案 1 :(得分:3)
您无法在order by
种子查询中使用where id in (select id from ...)
。反正这没有意义。此条件仅检查id
是否在子查询中。如果它影响输出的顺序,那只是偶然的。对于不同的数据查询,执行计划可能不同,输出顺序也会不同。在主查询的末尾使用显式order by
。
众所周知,Oracle的“功能”rownum
与order 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的其他类似问题,例如:
答案 2 :(得分:1)
您的外部查询无法“查看”内部查询中的ORDER,在这种情况下,内部的顺序没有意义,因为它(内部)仅用于创建将使用的数据子集在外部的WHERE上,所以这个子集的顺序无关紧要。
也许如果你更好地解释你想做什么,我们可以帮助你
答案 3 :(得分:0)
在子查询中按条件排序: 子查询中不允许使用order by子句,但内联视图除外。如果尝试包含ORDER BY子句,则会收到错误消息
内联视图是from子句的查询。
SELECT t.*
FROM (SELECT id, name FROM student) t