2009-05-17 4 views

ответ

42

Было бы полезно, если бы вы указать, какие базы данных вы ориентируетесь. Различные базы данных имеют разный синтаксис и методы для достижения этой цели:

Например, в Oracle вы можете ahieve это, поставив условие на RowNum (select ... from ... where ... rownum < 11 -> приведет вывода первых 10 записей)

В MySQL вы можете использовать вас может использовать пункт limit.

Microsoft SQL Server =>SELECT TOP 10 column FROM table

PostgreSQL и MySQL =>SELECT column FROM table LIMIT 10

Oracle =>select * from (SELECT column FROM table) WHERE ROWNUM <= 10 (благодаря STILI)

Sybase =>SET rowcount 10 SELECT column FROM table

Firebird =>SELECT FIRST 10 column FROM table

ПРИМЕЧАНИЕ: Современные ORM инструментов, такие как Hibernate дают высокий уровень API (запросы, ограничение, Состояние интерфейсы), что абстрактные логики верхних п строк на основе диалекта вы выбираете.

+1

Ingres and informix (SQL 92, я считаю) SELECT FIRST 10 column FROM table – corlettk

+0

Yup ...Очевидно, что SELECT FIRST 10 является стандартным. Ссылка: http://www.hamslab.com/~man2/sql/SQL98/index.html#sql92 – corlettk

+1

Извините, но решение Oracle не работает. Rownum требует, чтобы вложенный SQL работал, иначе он не будет обрабатывать любые формы заказа, кроме тривиального примера без предложения заказа. – stili

6

Я знаю это с MySQL, но я не знаю, является ли он стандартным SQL: конец запроса Query with 'limit X', X = n. линий, которые вы хотите получить.

Пример:

SELECT NAME FROM EMPLOYEES ORDER BY SALARY DESC LIMIT 10;

+0

+1. Я подозреваю, что LIMIT является стандартным SQL. В любом случае, он также работает с PostgreSQL. –

+1

Предел не является стандартным. MSSQL этого не имеет. –

+2

LIMIT не является стандартным, хотя он довольно распространен. Стандарт SQL: 2008 по какой-то причине пошел по методу DB2 FETCH FIRST, хотя очень немногие другие продукты реализуют это. См. Http://troels.arvin.dk/db/rdbms/#select-limit для получения более подробной информации , – kquinn

10

Для Oracle предлагаемое и принятое решение неверно. Попробуйте использовать предложение порядка, и результаты будут непредсказуемыми. SQL должен быть вложен, чтобы выполнить это в Oracle.

select name, price 
    from (
    select name, price, row_number() over (order by price) r 
     from items 
) 
where r between 1 and 5; 

Приведенный выше пример был заимствован из http://www.adp-gmbh.ch/ora/sql/examples/first_rows.html, который имеет хорошую дискуссию по этой теме.

+0

Спасибо stili за указание –

+0

Если вам нужен первый N в соответствии с конкретным заказом, рассмотрите индекс в столбце orderby (например, «цена» в этом примере) - оптимизатору может показаться дешевле прочитать индекс в порядке цены , тем самым ускоряя первые N строк без сканирования всей таблицы. Без индекса db должен прочитать все строки из таблицы, прежде чем он сможет окончательно сказать, что он нашел верхние N строк. –

-1

Для Oracle, вы можете попробовать это

select /*+ FIRST_ROWS(10) */ * from table; 
Смежные вопросы