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

したがって、順序を真ん中の基準に配置し、他の基準を 2 番目のレベルに配置し、行番号を最も外側のレベルに配置することをお勧めします。

4

1 に答える 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、行が結果セットに入ると値を取得するためです。そして、最初の行を削除するために2番目のレイヤーを追加します。

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 に答える