Подтвердить что ты не робот

Как пропустить первые n строк в sql-запросе

Я хочу запустить запрос "SELECT * FROM TABLE", но выберите только из строки N+1. Любая идея о том, как это сделать?

4b9b3361

Ответ 1

Запрос: в

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

fooobar.com/questions/64414/...

Ответ 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