Как реализовать LIMIT с Microsoft SQL Server?

У меня есть этот запрос с mysql:

select * from table1 LIMIT 10,20

Как я могу сделать это с помощью Microsoft sql?

Ответ 1

Запуск SQL SERVER 2005, вы можете сделать это...

USE AdventureWorks;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 10 AND 20;

или что-то вроде этого для версий 2000 и ниже...

SELECT TOP 10 * FROM (SELECT TOP 20 FROM Table ORDER BY Id) ORDER BY Id DESC

Ответ 2

Clunky, но он будет работать.

SELECT TOP 10 * FROM table WHERE id NOT IN (SELECT TOP 10 id FROM table ORDER BY id) FROM table ORDER BY id

Отсутствие MSSQL предложения LIMIT является уголовным, ИМО. Вам не нужно будет делать такого рода kludgy обходной путь.

Ответ 3

Начиная с SQL SERVER 2012, вы можете использовать предложение OFFSET FETCH:

USE AdventureWorks;
GO
SELECT SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader 
ORDER BY SalesOrderID
    OFFSET 10 ROWS
    FETCH NEXT 10 ROWS ONLY;
GO

http://msdn.microsoft.com/en-us/library/ms188385(v=sql.110).aspx

Это может работать некорректно, если порядок не уникален.

Если запрос изменен до ORDER BY OrderDate, возвращаемый результат не соответствует ожидаемому.

Ответ 4

Это почти дубликат вопроса, который я задал в октябре: Эмуляция предложения MySQL LIMIT в Microsoft SQL Server 2000

Если вы используете Microsoft SQL Server 2000, нет хорошего решения. Большинству людей приходится прибегать к получению результата запроса во временной таблице с помощью первичного ключа IDENTITY. Затем выполните запрос к столбцу первичного ключа, используя условие BETWEEN.

Если вы используете Microsoft SQL Server 2005 или более позднюю версию, у вас есть функция ROW_NUMBER(), поэтому вы можете получить тот же результат, но избегать временной таблицы.

SELECT t1.*
FROM (
    SELECT ROW_NUMBER OVER(ORDER BY id) AS row, t1.*
    FROM ( ...original SQL query... ) t1
) t2
WHERE t2.row BETWEEN @offset+1 AND @[email protected];

Вы также можете записать это как общее табличное выражение, как показано в @Leon Tayson answer.

Ответ 5

SELECT  *
FROM    (
        SELECT  TOP 20
                t.*, ROW_NUMBER() OVER (ORDER BY field1) AS rn
        FROM    table1 t
        ORDER BY
                field1
        ) t
WHERE   rn > 10

Ответ 6

Вот как я ограничиваю результаты в MS SQL Server 2012:

SELECT * 
FROM table1
ORDER BY columnName
  OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

ПРИМЕЧАНИЕ. OFFSET можно использовать только в сочетании с ORDER BY.

Чтобы объяснить строку кода OFFSET xx ROWS FETCH NEXT yy ROW ONLY

xx - это номер записи/строки, из которого вы хотите начать извлечение в таблице, т.е. Если в таблице 1 имеется 40 записей, приведенный выше код начнет вытягивать из строки 10.

yy - это количество записей/строк, которые вы хотите извлечь из таблицы.

Чтобы построить на предыдущем примере: Если в таблице 1 есть 40 записей, и вы начали вытягивать из строки 10 и захватить СЛЕДУЮЩИЙ набор 10 (yy). Это будет означать, что приведенный выше код будет извлекать записи из таблицы 1, начиная с строки 10 и заканчивая 20. Таким образом, вытягивая строки 10 - 20.

Проверьте ссылку для получения дополнительной информации о смещении

Ответ 7

Синтаксически запрос MySQL LIMIT выглядит примерно так:

SELECT * FROM table LIMIT OFFSET, ROW_COUNT

Это может быть переведено на Microsoft SQL Server, например

SELECT * FROM 
(
    SELECT TOP #{OFFSET+ROW_COUNT} *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum 
    FROM table
) a
WHERE rnum > OFFSET

Теперь ваш запрос select * from table1 LIMIT 10,20 будет выглядеть следующим образом:

SELECT * FROM 
(
    SELECT TOP 30 *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum 
    FROM table1
) a
WHERE rnum > 10 

Ответ 8

Это одна из причин, почему я стараюсь избегать использования MS Server... но в любом случае. Иногда у вас просто нет опции (yei! И мне нужно использовать устаревшую версию!!).

Мое предложение - создать виртуальную таблицу:

From:

SELECT * FROM table

To:

CREATE VIEW v_table AS    
    SELECT ROW_NUMBER() OVER (ORDER BY table_key) AS row,* FROM table

Затем просто запрос:

SELECT * FROM v_table WHERE row BETWEEN 10 AND 20

Если поля добавлены или удалены, "строка" обновляется автоматически.

Основная проблема с этой опцией заключается в том, что ORDER BY исправлен. Поэтому, если вам нужен другой порядок, вам нужно будет создать другое представление.

UPDATE

Есть еще одна проблема с этим подходом: если вы попытаетесь отфильтровать свои данные, это не сработает, как ожидалось. Например, если вы выполните:

SELECT * FROM v_table WHERE field = 'test' AND row BETWEEN 10 AND 20

ГДЕ ограничивается теми данными, которые находятся в строках от 10 до 20 (вместо поиска всего набора данных и ограничения выхода).

Ответ 9

Это многоступенчатый подход, который будет работать в SQL2000.

-- Create a temp table to hold the data
CREATE TABLE #foo(rowID int identity(1, 1), myOtherColumns)

INSERT INTO #foo (myColumns) SELECT myData order By MyCriteria

Select * FROM #foo where rowID > 10

Ответ 10

SELECT 
    * 
FROM 
    (
        SELECT 
            top 20              -- ($a) number of records to show
            * 
        FROM
            (
                SELECT 
                    top 29      -- ($b) last record position
                    * 
                FROM 
                    table       -- replace this for table name (i.e. "Customer")
                ORDER BY 
                    2 ASC
            ) AS tbl1 
        ORDER BY 
            2 DESC
    ) AS tbl2 
ORDER BY 
    2 ASC;

-- Examples:

-- Show 5 records from position 5:
-- $a = 5;
-- $b = (5 + 5) - 1
-- $b = 9;

-- Show 10 records from position 4:
-- $a = 10;
-- $b = (10 + 4) - 1
-- $b = 13;

-- To calculate $b:
-- $b = ($a + position) - 1

-- For the present exercise we need to:
-- Show 20 records from position 10:
-- $a = 20;
-- $b = (20 + 10) - 1
-- $b = 29;

Ответ 11

Должен попытаться. В приведенном ниже запросе вы можете видеть группирование по, упорядочение по, пропуск строк и ограничение строк.

select emp_no , sum(salary_amount) from emp_salary
Group by emp_no 
ORDER BY emp_no 
OFFSET 5 ROWS       -- Skip first 5 
FETCH NEXT 10 ROWS ONLY; -- limit to retrieve next 10 row after skiping rows

Ответ 12

В SQL не существует ключевого слова LIMIT. Если вам нужно только ограниченное количество строк, вы должны использовать ключевое слово TOP, которое похоже на LIMIT.

Ответ 13

Если ваш идентификатор является уникальным типом идентификатора или ваш идентификатор в таблице не отсортирован, вы должны сделать это ниже.

select * from
(select ROW_NUMBER() OVER (ORDER BY (select 0)) AS RowNumber,* from table1) a
where a.RowNumber between 2 and 5



Код будет

select * from limit 2,5

Ответ 14

  лучше использовать это в MSSQLExpress 2017 года.

SELECT * FROM
(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) as [Count], * FROM table1
) as a
WHERE [Count] BETWEEN 10 and 20;

--Giving a Column [Count] и присваиваем каждой строке уникальный подсчет без упорядочивания чего-либо, а затем снова выбираем, где вы можете указать свои пределы.. :)

Ответ 15

Если я правильно помню (прошло некоторое время с тех пор, как я получил SQL Server), вы можете использовать что-то вроде этого: (2005 и выше)

SELECT
    *
   ,ROW_NUMBER() OVER(ORDER BY SomeFields) AS [RowNum]
FROM SomeTable
WHERE RowNum BETWEEN 10 AND 20