2014-10-15 2 views
0

Предположим, у меня есть 500 записей в tbl_students. Я хотел бы выбрать записи, начиная с 50 и 250. Я знаю, что могу использовать следующий способ в MySql.Выберите данные по диапазону в SQL Server

SELECT * 
FROM tbl_students 
LIMIT 50,100; 

Я хотел бы знать, как это сделать в SQL Server. После просмотра я нашел решение вроде этого.

select top 100 * 
from tablename 
WHERE column_name BETWEEN 50 AND 250 

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

Заранее спасибо

+2

Which ** версия ** в SQL Server ты с нами? SQL Server ** 2012 ** представил синтаксис 'OFFSET .. FETCH', чтобы сделать это очень легко. –

+2

Ваш первый запрос не имеет смысла без предложения ORDER BY. Как вы определяете первые 100 записей? Или первые 250 в вашем втором запросе? – GarethD

ответ

3

Если вы используете SQL Server 2005/08, то вы могли бы использовать CTE ...

;WITH cteRange as 
(
select *, rownumber=ROW_NUMBER() OVER (Order by field) 
from tablename 
) 
SELECT * FROM cteRange WHERE rownumber BETWEEN 50 AND 250 

, если у вас есть SQL Server 2012, затем ...

SELECT 
    * 
FROM tablename 
ORDER BY field 
    OFFSET 50 ROWS 
    FETCH NEXT 200 ROWS ONLY 

Было бы полезно знать RDBMS, а также, какие столбцы вы хотите извлечь и Приказ, вместо использования SELECT *...

3
SELECT * FROM ( 
    SELECT *, ROW_NUMBER() OVER (ORDER BY column_name) as tbl_row FROM tbl_students 
) tbl WHERE tbl_row >= 50 and tbl_row <= 250 

Я думаю, что это один из пути доступны для этого в SQL Server выше версии 2005

3

Это не ясно, какой столбец (ы) вы хотите отсортировать. Таблица не имеет неявного порядка, поэтому вы не можете сказать «дайте мне записи между x и y», если вы не укажете, как вы хотите заказать записи.

Однако, если предположить, что column_name есть столбец, который вы хотите использовать, и вы используете SQL Server 2005 или более поздней версии, вы можете использовать функцию в CTE с ROW_NUMBER окна:

WITH CTE AS 
(
    SELECT t.*, R = ROW_NUMBER() OVER (ORDER BY column_name) 
    FROM dbo.TableName t 
) 
SELECT * FROM CTE WHERE RN BETWEEN 50 AND 250 
Смежные вопросы