- 1
- 2
- 3
- 4
- 5
- 6
- 7
select o.*
from (select rownum rw
, o.*
from (select o.* from all_tables o order by table_name) o
where rownum < 20
) o
where o.rw >= 10;
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−113
select o.*
from (select rownum rw
, o.*
from (select o.* from all_tables o order by table_name) o
where rownum < 20
) o
where o.rw >= 10;
Стандартный аналог "LIMIT 9,10" в Oracle.
http://www.sql.ru/faq/faq_topic.aspx?fid=171
А это значит, что нам нужен пронумерованный резалт сет, а потом уже выбирать из него.
по-моему, подход полностью аналогичен LIMIT из MySQL
http://orafaq.com/wiki/ROWNUM
В MS SQL Server абсолютно идентичный подход, как в Оракле.
А чем не нравится, собственно, версия с подзапросом? Только удобством использования? Сомнительный аргумент.
SELECT t3.row, t1.* FROM all_tables t1
INNER JOIN
(
SELECT ROW_NUMBER() OVER (ORDER BY t2.ID) row, t2.ID
FROM all_tables t2
) t3 ON t1.ID=t3.ID
WHERE t3.row > 10 AND t3.row < 20
Или аналогично можно сделать с условием WHERE t1.ID IN (...), но тогда номера строк не получится вывести. Согласен, что подход идентичный.
Db2, Postgres, Firebird. Хотя, в фиребёрде всё сделано через жопу. Там фетч не влияет на выбираемый сет. запрос выполняется весь, а потом от него откусывается нужное число строк.
> А чем не нравится
Обычно, подзапросы тормозят. Плюс, см. выше, нафиг нам такое счастье, получать пронумерованный сет на стопицот тысяч миллионов строк, дабы выбрать первые три?
Такой паровоз не полетит.
http://troels.arvin.dk/db/rdbms/#select-limit
Спасибо, что прервали ДБсрач.
Только замечу, что в представленной ссылке, не рассматриваются более тяжелые случаи, когда надо выбрать строки с N по M, а только выборка первых N строк.
Угу. Причем очень познавательный.
>не рассматриваются более тяжелые случаи,
>выбрать строки с N по M
Всё там рассматривается, просто надо внимательно рассматривать.
Limit—with offset
Правда в моём случае оно не помогает, ибо An ORDER BY clause is not allowed in a derived table.