Получить фиксированное количество строк в SQL-запросе в Oracle

Пожалуйста, помогите мне написать запрос SQL в базе данных Oracle. Есть таблица с именем tbl, и в ней 12 строк. Я хочу выбрать первые 4 строки сначала, затем следующие 4 и последние 4 строки.

Может кто-нибудь сказать мне, как я могу сделать это в Informix.

3 ответа

Решение

Ты можешь использовать rownum:

select * from (select t.*, rownum rn from tbl t) where rn between 1 and 4;
/
select * from (select t.*, rownum rn from tbl t) where rn between 5 and 8;
/
select * from (select t.*, rownum rn from tbl t) where rn between 9 and 12;
/

Если вы используете order by пункт затем использовать row_number() ( документация)

select * from (select t.*, row_number() over (order by column_name) rn from tbl t) where rn between 1 and 4;
/
select * from (select t.*, row_number() over (order by column_name) rn from tbl t) where rn between 5 and 8;
/
select * from (select t.*, row_number() over (order by column_name) rn from tbl t) where rn between 9 and 12;
/

РЕДАКТИРОВАТЬ: теперь должно быть исправлено с 3-уровневым выбором:

select * from (
  select q1.*, rownum as rn from (   --get correct rownum 
      select * from tbl order by column --get correct order
  ) q1
) q2
 where q2.rn between 1 and 4; -- filter

для первой части.

Для второй и третьей части:

 where q2.rn between 5 and 8
 where q2.rn between 9 and 12

Ничто не называется первыми строками, последними строками, "n" строками, если вы явно не укажете ORDER BY, а затем не выберете необходимые строки.

Позвольте мне показать новую технику предложения ограничения количества строк для запросов Top-N в Oracle Database 12c:

SQL> DROP TABLE order_test;

Table dropped.

SQL>
SQL> CREATE TABLE order_test (
  2    val  NUMBER
  3  );

Table created.

SQL>
SQL> INSERT ALL
  2    INTO order_test
  3    INTO order_test
  4  SELECT level
  5  FROM   dual
  6  CONNECT BY level <= 10;

20 rows created.

SQL>
SQL> COMMIT;

Commit complete.

SQL>
SQL> select * from order_test order by val;

       VAL
----------
         1
         1
         2
         2
         3
         3
         4
         4
         5
         5
         6
         6
         7
         7
         8
         8
         9
         9
        10
        10

20 rows selected.

Первые 4 ряда:

SQL> SELECT val
  2  FROM   order_test
  3  ORDER BY VAL
  4  FETCH FIRST 4 ROWS ONLY;

       VAL
----------
         1
         1
         2
         2

Следующие 4 строки (посмотрите на OFFSET):

SQL> SELECT val
  2  FROM   order_test
  3  ORDER BY VAL
  4  OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;

       VAL
----------
         3
         3
         4
         4

Наконец, следующие 4 строки с 8-ю СМЕЩЕНИЯМИ:

SQL> SELECT val
  2  FROM   order_test
  3  ORDER BY VAL
  4  OFFSET 8 ROWS FETCH NEXT 4 ROWS ONLY;

       VAL
----------
         5
         5
         6
         6

Аккуратно, не правда ли?

Другие вопросы по тегам