Эквиваленты SQL Server TOP

В SQL Server TOP может использоваться для возврата первого числа строк в запросе. Например,

SELECT TOP 100 * FROM users ORDER BY id
может использоваться для возврата первых 100 человек, зарегистрированных для сайта. (Это не обязательно лучший способ, я просто использую его в качестве примера).

Мой вопрос: что эквивалентно TOP в других базах данных, таких как Oracle, MySQL, PostgreSQL и т.д.? Если нет эквивалентного ключевого слова, какие обходные пути вы можете рекомендовать для достижения того же результата?

Ответы

Ответ 1

Чтобы выбрать первые строки 100:

MySQL и PostgreSQL:

SELECT  *
FROM    Table
ORDER BY
        column
LIMIT 100

Oracle:

SELECT  *
FROM    (
        SELECT  t.*
        FROM    table
        ORDER BY
                column
        )
WHERE   rownum <= 100

Обратите внимание, что здесь необходим подзапрос. Если вы не добавляете подзапрос, ROWNUM будет выбирать первые строки 10 в случайном порядке, а затем сортировать их по column.

Чтобы выбрать строки между 100 и 300:

MySQL:

SELECT  *
FROM    TABLE
ORDER BY
        column
LIMIT   100, 200

PostgreSQL:

SELECT  *
FROM    Table
ORDER BY
        column
OFFSET 100 LIMIT 200

Oracle:

SELECT  *
FROM    (
        SELECT  t.*, ROW_NUMBER() OVER (ORER BY column) AS rn
        FROM    table
        )
WHERE   rn >= 100
        AND rownum <= 200

Обратите внимание, что попытка упростить его с помощью ROWNUM BETWEEN 100 AND 200 (в отличие от rn BETWEEN 100 AND 200 во внешнем запросе) ничего не вернет в Oracle!

rn BETWEEN 100 AND 200 будет работать и в Oracle, но менее эффективен.

См. статью в своем блоге для подробностей о производительности:

Ответ 2

Для Postgres и MySQL это ключевое слово LIMIT.

SELECT *
  FROM users
 ORDER BY id
 LIMIT 100;

Ответ 3

Это стандартный SQL (Oracle и SQL Server реализуют его). Это пример возврата до 100 строк:

        SELECT ID_CONTROL FROM (SELECT ROW_NUMBER() OVER (ORDER BY ID_CONTROL) 
        ROWNUMBER, ID_CONTROL FROM IWS_CONTROL WHERE 
        CURRENT_STATE = 15 AND CURRENT_STATUS=0) A WHERE ROWNUMBER <= 100)

Ответ 4

В SQL Anywhere он аналогичен SQL Server:

SELECT TOP 100 * FROM users ORDER BY id

Вы можете даже начать посередине результирующего набора, если хотите:

SELECT TOP 100 START AT 50 * FROM users ORDER BY id

получает от 50 до 150 строк результирующего набора.

Ответ 5

LIMIT 100

как в

SELECT * FROM foo ORDER BY bar LIMIT 100

Ответ 6

Вы можете использовать RANK() и DENSE_RANK() в Oracle. Здесь - ссылка на сайт AskTom, в котором объясняется, как обращаться к разбивке на страницы и сверху-запросы с помощью DENSE_RANK в Oracle.

Ответ 7

Oracle:

select * from (select * from foo ORDER BY bar) where rownum < 100

С хорошим объяснением, как заставить его работать в AskTom.

В Ingres тот же запрос будет:

select First 100 * from foo ORDER BY bar

Вопрос Ingres уже был дан в fooobar.com/questions/361265/... раньше.

Ответ 8

В DB2 вы должны сделать свой запрос следующим:

SELECT * FROM tblData FETCH FIRST 10 ROWS ONLY;

Ответ 9

В Oracle вы хотите использовать запрос TOP-N.

Например:

select  *
  from  (SELECT  *
           FROM  foo
          where  foo_id=[number]
       order by  foo_id desc)
 where  rownum <= 3

Это даст вам три лучших результата (потому что я заказываю по убыванию в подзапросе)