- 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
eth0 12.01.2012 12:42 # −1
Lure Of Chaos 12.01.2012 13:42 # 0
DBdev 12.01.2012 15:22 # +1
А это значит, что нам нужен пронумерованный резалт сет, а потом уже выбирать из него.
Lure Of Chaos 12.01.2012 15:53 # −1
по-моему, подход полностью аналогичен LIMIT из MySQL
DBdev 12.01.2012 16:59 # +1
http://orafaq.com/wiki/ROWNUM
DBdev 12.01.2012 15:28 # +2
В MS SQL Server абсолютно идентичный подход, как в Оракле.
А чем не нравится, собственно, версия с подзапросом? Только удобством использования? Сомнительный аргумент.
Eugene 12.01.2012 16:21 # 0
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 (...), но тогда номера строк не получится вывести. Согласен, что подход идентичный.
eth0 12.01.2012 18:12 # −1
Db2, Postgres, Firebird. Хотя, в фиребёрде всё сделано через жопу. Там фетч не влияет на выбираемый сет. запрос выполняется весь, а потом от него откусывается нужное число строк.
> А чем не нравится
Обычно, подзапросы тормозят. Плюс, см. выше, нафиг нам такое счастье, получать пронумерованный сет на стопицот тысяч миллионов строк, дабы выбрать первые три?
Такой паровоз не полетит.
bugmenot 12.01.2012 19:08 # +3
http://troels.arvin.dk/db/rdbms/#select-limit
DBdev 12.01.2012 19:32 # 0
Спасибо, что прервали ДБсрач.
Только замечу, что в представленной ссылке, не рассматриваются более тяжелые случаи, когда надо выбрать строки с N по M, а только выборка первых N строк.
bugmenot 12.01.2012 20:09 # 0
eth0 12.01.2012 20:53 # +2
3.14159265 13.01.2012 14:45 # 0
Угу. Причем очень познавательный.
>не рассматриваются более тяжелые случаи,
>выбрать строки с N по M
Всё там рассматривается, просто надо внимательно рассматривать.
Limit—with offset
Правда в моём случае оно не помогает, ибо An ORDER BY clause is not allowed in a derived table.
DBdev 12.01.2012 17:25 # 0