1

在 Oracle 中没有限制,所以我使用了这个:

SELECT * 
FROM ( 
     SELECT m.*, ROWNUM r 
     FROM TABLE_NAME m  
     WHERE COL LIKE XYZ 
     ORDER BY ID ASC
     ) 
WHERE r BETWEEN 10 AND 20;

但它仍然没有被订购。它是从 20 到 10 订购的,但不是整个桌子。我怎样才能做到这一点?

我想用WHERE子句订购整个表并获得范围内的表。上面的解决方案只在范围内排序。


也许不那么令人困惑的解决方案(以防有人在这里搜索):

SELECT a.* from (
  SELECT b.*, ROWNUM r FROM ( 
    SELECT * FROM table ORDER BY id ASC  
  ) b  WHERE  (city LIKE '%abc%' OR city IS NULL)
) a where r between 5 and 10

因此,最好将 order 放在中间条件中,然后将其他条件放在第二级,并将行号放在最外层。

4

1 回答 1

1

据我所知,您需要多一层嵌套,例如:

select b.* from (
 select a.*, rownum rnum from (
  select * from foo order by id
 ) a where rownum <= 20
) b where b.rnum >= 10;

演示:

SQL> create table foo (id number);
Table created.
SQL> insert into foo
  2   select round(dbms_random.value(0, 1000))
  3   from dual
  4   connect by level <= 15;
15 rows created.
SQL> commit;
Commit complete.

rownum在订购之前被“物化”,因此您的方法无法奏效,正如您所注意到的:

SQL> select foo.*, rownum from foo order by id;

    ID     ROWNUM
---------- ----------
        24     15
       148      5
       151      2
       225      7
       234     11
       292      1
       305      4
       351      9
       383      8
       394     13
       426     12
       477     10
       553      6
       594     14
       917      3
15 rows selected.

所以嵌套一次以获得排序后的行号:

SQL> select a.*, rownum from (
  2   select * from foo order by id
  3  ) a;

    ID     ROWNUM
---------- ----------
        24      1
       148      2
       151      3
       225      4
       234      5
       292      6
       305      7
       351      8
       383      9
       394     10
       426     11
       477     12
       553     13
       594     14
       917     15
15 rows selected.

但是你不能这样做between

SQL> select a.*, rownum from (
  2   select * from foo order by id
  3  ) a where rownum between 5 and 10;

no rows selected

这是因为rownum只有在一行进入结果集时才会获取一个值。并添加第二层以删除第一行:

SQL> select id, rnum from (
  2   select id, rownum rnum from (
  3    select id from foo order by id
  4   ) a where rownum <= 10
  5  ) b where b.rnum >= 5;

    ID   RNUM
---------- ----------
       234      5
       292      6
       305      7
       351      8
       383      9
       394     10

6 rows selected.
于 2012-11-02T16:21:06.617 回答