Могу ли я использовать LIMIT N, M в базе данных SQL Server - PullRequest
1 голос
/ 11 ноября 2011

У меня есть следующий оператор SQL:

SELECT [id], [name]
FROM [dbo.test_db_002] t1
LEFT JOIN [dbo.test_db_003] t2 ON t1.[id] = t2.[itmid]
ORDER BY t2.[iid] ASC;

Это кажется очень простым, но я не могу понять это.Мне нужно добавить LIMIT N,M к нему, чтобы получить M элементов из N-го, но я продолжаю получать ошибки вокруг слова «limit».Я пытался поместить это предложение LIMIT везде, где только мог, внутри оператора sql, но безрезультатно.

PS.Я пишу для SQL Server, который поставляется с VS2010.

Ответы [ 4 ]

4 голосов
/ 11 ноября 2011

Чтобы ответить на ваш запрос, вы можете захотеть: (в зависимости от ваших значений для M и N)

WITH cte AS
(
   SELECT [id], [name], ROW_NUMBER() OVER (ORDER BY t2.[iid] ASC) AS rowNumber
   FROM [dbo.test_db_002] t1
   LEFT JOIN [dbo.test_db_003] t2 ON t1.[id] = t2.[itmid]
)
SELECT [id], [name]
FROM cte
WHERE rowNumber BETWEEN 3 AND 5

На что следует обратить внимание, значения между ними BETWEEN N AND N + M

Кроме того, вот ссылка с информацией о Общих табличных выражениях , что является синтаксисом WITH cte, который я использовал.

3 голосов
/ 11 ноября 2011

В SQL Server нет прямого эквивалента LIMIT N,M, но вы можете сделать что-то вроде этого:

SELECT * FROM
  (SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM MyTable) a
WHERE row > 5 and row <= 10

Подробнее см. Здесь: «LIMIT» в SQL Server

1 голос
/ 11 ноября 2011

Вы можете использовать Row_Number ()

пример:

select * from 
(
  select cola, colb, row_number() over (order by col1 desc) as row
  from table ) x
where row between value1 and value2
0 голосов
/ 13 февраля 2012

Предел со смещением в SQL Server 2012:

SELECT email FROM myTable
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;

// смещение - нет.пропущенных строк

// следующий - обязательно номерследующих строк

...