不在Oracle子查询中工作的顺序

时间:2012-08-09 11:17:05

标签: sql oracle

我正试图从今天的日期开始从表中返回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 个答案:

答案 0 :(得分:10)

在处理ORDER BY之前应用 {<1>}“函数”的值。这就是为什么它不能像你使用它一样工作(See the manual用于类似的解释)

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

ROWNUM

答案 1 :(得分:3)

  1. 您无法在order by种子查询中使用where 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
    

  3. 另见:

    另见关于SO的其他类似问题,例如:

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

在子查询中按条件排序: 子查询中不允许使用order by子句,但内联视图除外。如果尝试包含ORDER BY子句,则会收到错误消息

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

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