2015-04-27 5 views
7

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

+4

Какого RDBMS вы используете (f.e. Oracle, MySQL или SQL-сервер)? –

+6

Какие dbms? «OFFSET n» - это ANSI SQL, но многие продукты dbms делают это по-своему, например. LIMIT, TOP ... – jarlh

+1

Кроме того, если вы хотите найти строки в заданном диапазоне строк, вы можете использовать такие функции, как ['ROW_NUMBER'] (https://msdn.microsoft.com/en-us/library/ms186734 .aspx). Но это действительно зависит от ваших dbms. –

ответ

4

Запрос: в

declare @N int= 5 --Any random number 

SELECT * FROM (
     SELECT ROW_NUMBER()OVER(ORDER BY ID)AS ID 
       ,ID 
     FROM TABLE_NAME 
)AS tbl 
WHERE ID >= @N + 1 
ORDER BY tbl.ID 

Это даст строки таблицы, где находится ID начиная с @N + 1.

+9

Я не согласен с этим ответом, это не работает так, как вы хотите. С помощью этого решения вы не пропустите N строк, поместите N строк с идентификатором> = N –

+0

Примечание * Этот ответ работает только в том случае, если ваш идентификатор находится в последовательном порядке и вы никогда не удаляли строку из этой таблицы. –

11

SQL Server:

select * from table 
except 
select top N * from table 

Oracle:

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 

Они могут удовлетворить ваши потребности более или менее.

Нет прямого способа сделать то, что вы хотите от SQL. Однако, на мой взгляд, это не ошибка дизайна.

SQL не должен использоваться таким образом.

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

Также не зависит от физического объема записей. Считывание строк не гарантируется СУРБД.

Если порядок записей является важным, лучше добавить столбец, такой как «Num» в таблицу, и использовать следующий запрос. Это более естественно.

select * 
from Table 
where Num > N 
order by Num 
+1

ANSI SQL: «выберите * из tablename OFFSET n», а также в этом случае рекомендуется ORDER BY. – jarlh

+1

(a) Да, хороший Ответ. См. Мой комментарий к Вопросу. (b) В последнем предложении вам не нужно * добавлять * столбец, просто «ORDER BY ...», любой столбец необходим, чтобы получить нужный результат. (c) Используйте «ЗАКАЗАТЬ».' – PerformanceDBA

2

насчет:

SELECT * FROM table LIMIT 50 OFFSET 1 
+3

Обратите внимание, что это не будет работать во всех вариантах SQL, поскольку ключевые слова' LIMIT' и 'OFFSET' не являются частью стандарта ANSI (см. [Этот вопрос] (http://stackoverflow.com/q/1528604/ 168775)). – eykanal

4

Вы хотите что-то, как в LINQ пропустить 5 и взять 10?

SELECT TOP(10) * 
FROM MY_TABLE 
WHERE ID not in (SELECT TOP(5) ID From My_TABLE); 
21

Используйте это:

SELECT * 
FROM Sales.SalesOrderHeader 
ORDER BY OrderDate 
OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY 

https://stackoverflow.com/a/19669165/1883345

+0

ПРИМЕЧАНИЕ. Этот запрос работает только на SQL Server 2012 и выше –

-2

Для SQL2012 и более поздних версий, лучший способ @ ответ MajidBasirati в.

Я также любил ответ @ CarlosToledo, он не ограничен какой-либо версией SQL Server, но ему не хватает Order By Clauses. Без них он может вернуть неверные результаты.

Для SQL 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 
4

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

Пример:

select * from table order by [some_column] 
offset 10 rows 
FETCH NEXT 10 rows only 
1

Это работает со всеми 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 
+0

Закодированный оператор select выше пропускает первые n строк с большим значением в столбце_порядке. Вы можете изменить условие для получения меньшего размера, как вы хотите. – fspino

1

Я знаю, что это довольно поздно, чтобы ответить на запрос. Но у меня есть немного другое решение, чем у других, которые, как я считаю, имеют лучшую производительность, потому что в SQL-запросе не выполняется сравнение. Вы можете увидеть его значительное улучшение производительности в основном, когда значение SKIP достаточно велико.

  1. Лучшая производительность, но только для SQL Server 2012 и выше. Первоначально от @Majid Basirati's answer, о котором стоит упомянуть еще раз.

    DECLARE @Skip INT = 2, @Take INT = 2 
    
    SELECT * FROM TABLE_NAME 
    ORDER BY ID ASC 
    OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY 
    
  2. Не так хорошо, как и первый, но совместим с 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 
    
0

В FairCom SQL (который является псевдо-MySQL), я могу сделать это в супер простой оператора SQL, просто следующим образом:

SELECT SKIP 10 * FROM TABLE ORDER BY Id 

Очевидно, что вы можете просто заменить 10 с любая заявленная переменная вашего желания.

У меня нет доступа к MS SQL или другим платформам, но я действительно удивлюсь, что MS SQL не поддерживает что-то вроде этого.

0

попробовать ниже запроса это работа

SELECT * FROM `my_table` WHERE id != (SELECT id From my_table LIMIT 1) 

Надеется, что это поможет

Смежные вопросы