Эквиваленты 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
Это даст вам три лучших результата (потому что я заказываю по убыванию в подзапросе)