Я хочу запустить запрос "SELECT * FROM TABLE
", но выберите только из строки N+1
. Любая идея о том, как это сделать?
Как пропустить первые n строк в sql-запросе
Ответ 1
Запрос: в sql-server
DECLARE @N INT = 5 --Any random number
SELECT * FROM (
SELECT ROW_NUMBER() OVER(ORDER BY ID) AS RoNum
, ID --Add any fields needed here (or replace ID by *)
FROM TABLE_NAME
) AS tbl
WHERE @N < RoNum
ORDER BY tbl.ID
Это даст строки таблицы, где rownumber начинается с @N + 1
.
Ответ 2
Используйте это:
SELECT *
FROM Sales.SalesOrderHeader
ORDER BY OrderDate
OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY
Ответ 3
SQL Server:
select * from table
except
select top N * from table
Oracle до 11.2:
select * from table
minus
select * from table where rownum <= N
with TableWithNum as (
select t.*, rownum as Num
from Table t
)
select * from TableWithNum where Num > N
Oracle 12.1 и новее (в соответствии со стандартом ANSI SQL)
select *
from table
order by some_column
offset x rows
fetch first y rows only
Они могут удовлетворить ваши потребности более или менее.
Нет прямого способа сделать то, что вы хотите с помощью SQL. Однако, на мой взгляд, это не недостаток дизайна.
SQL не должен использоваться таким образом.
В реляционных базах данных таблица представляет отношение, которое задается по определению. Набор содержит неупорядоченные элементы.
Кроме того, не полагайтесь на физический порядок записей. Порядок строк не гарантируется СУБД.
Если порядок записей важен, вам лучше добавить в таблицу такой столбец, как "Num", и использовать следующий запрос. Это более естественно.
select *
from Table
where Num > N
order by Num
Ответ 4
Чтобы сделать это в SQL Server, вы должны заказать запрос по столбцу, чтобы вы могли указать нужные строки.
Пример:
select * from table order by [some_column]
offset 10 rows
FETCH NEXT 10 rows only
Ответ 5
Вы хотите что-то вроде в LINQ пропустить 5 и взять 10?
SELECT TOP(10) * FROM MY_TABLE
WHERE ID not in (SELECT TOP(5) ID From My_TABLE);
Этот подход будет работать в любой версии SQL.
Ответ 6
Я знаю, что довольно поздно ответить на запрос. Но у меня есть немного другое решение, чем у других, которые, как я считаю, имеют лучшую производительность, потому что в SQL-запросе не выполняется сравнение. Вы можете увидеть его значительное улучшение производительности в основном, когда значение SKIP достаточно велико.
-
Наилучшая производительность, но только для SQL Server 2012 и выше. Первоначально из @Majid Basirati answer, о котором стоит упомянуть снова.
DECLARE @Skip INT = 2, @Take INT = 2 SELECT * FROM TABLE_NAME ORDER BY ID ASC OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY
-
Не так хорошо, как первый, но совместим с SQL Server 2005 и выше.
DECLARE @Skip INT = 2, @Take INT = 2 SELECT * FROM ( SELECT TOP (@Take) * FROM ( SELECT TOP (@Take + @Skip) * FROM TABLE_NAME ORDER BY ID ASC ) T1 ORDER BY ID DESC ) T2 ORDER BY ID ASC
Ответ 7
Как насчет:
SELECT * FROM table LIMIT 50 OFFSET 1
Ответ 8
Это работает со всеми DBRM/SQL, это стандартный ANSI:
SELECT *
FROM owner.tablename A
WHERE condition
AND n+1 <= (
SELECT COUNT(DISTINCT b.column_order)
FROM owner.tablename B
WHERE condition
AND b.column_order>a.column_order
)
ORDER BY a.column_order DESC
Ответ 9
В Faircom SQL (который является псевдо MySQL) я могу сделать это в простом SQL-заявлении, как показано ниже:
SELECT SKIP 10 * FROM TABLE ORDER BY Id
Очевидно, вы можете просто заменить 10
любой объявленной переменной вашего желания.
У меня нет доступа к MS SQL или другим платформам, но я действительно удивлюсь, что MS SQL не поддерживает что-то вроде этого.
Ответ 10
попробуйте выполнить запрос
SELECT * FROM `my_table` WHERE id != (SELECT id From my_table LIMIT 1)
Надеюсь, это поможет
Ответ 11
Для SQL Server 2012 и более поздних версий лучшим методом является ответ @MajidBasirati.
Мне также понравился ответ @CarlosToledo, он не ограничен какой-либо версией SQL Server, но в нем отсутствуют пункты Order By. Без них это может привести к неверным результатам.
Для SQL Server 2008 и более поздних версий я бы использовал Common Table Expressions для повышения производительности.
-- This example omits first 10 records and select next 5 records
;WITH MyCTE(Id) as
(
SELECT TOP (10) Id
FROM MY_TABLE
ORDER BY Id
)
SELECT TOP (5) *
FROM MY_TABLE
INNER JOIN MyCTE ON (MyCTE.Id <> MY_TABLE.Id)
ORDER BY Id