Получить фиксированное количество строк в 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
Аккуратно, не правда ли?