SQL Server选择两个值之间的行

时间:2011-03-30 01:45:02

标签: sql sql-server

希望标题解释得足够,但我希望能够在两个值之间的SQL Server表中选择行

例如

SELECT * FROM table WHERE rows between 20 and 60

我尝试了ROW_NUMBER()然后使用WHERE子句....

谢谢,

杰森

6 个答案:

答案 0 :(得分:10)

SELECT TOP 40 * FROM (SELECT TOP 60 * FROM table ORDER BY xx ASC) t ORDER BY xx DESC

由于select语句的输出可以按任何顺序返回记录(没有order by子句),您需要决定应用于记录的顺序...如果您不知道或不关心,请使用主键(替代xx)

答案 1 :(得分:6)

WITH mytable AS
(
   SELECT *,
    ROW_NUMBER() OVER (order by colname) AS 'RowNumber'
    FROM table
) 
SELECT * 
FROM myTable 
WHERE RowNumber BETWEEN 20 AND 60;

答案 2 :(得分:3)

如果你有SQL Server 2012(或更高版本),你可以使用Offset-Fetch 见Microsoft Technet Article on the Offset-Fetch Clause 您需要指定一个Order-By(我认为很明显)。

如果你想要20到60之间的行,那么你真正想说的是你想从20开始(你的偏移),然后选择(或获取)下一个40。

SELECT *
  FROM TableName
 ORDER BY SomeColumnName
 OFFSET 20 ROWS
 FETCH NEXT 40 ROWS ONLY

您甚至可以将变量和计算用于获取和偏移值 以下是问题所要求的示例:20到60之间的行

DECLARE @RowStart Int = 20
DECLARE @RowEnd   Int = 60
SELECT *
  FROM TableName
 ORDER BY SomeColumnName
 OFFSET @RowStart ROWS
 FETCH NEXT (@RowEnd - @RowStart) ROWS ONLY

答案 3 :(得分:2)

在以前的SQL版本中,一个选项是使用临时表:

SELECT  IDENTITY(int,1,1) RowNumber,* 
into    #Temp
FROM    Table1

SELECT  *
FROM    #Temp
WHERE   RowNumber between 20 and 60 

答案 4 :(得分:1)

此查询可以为您提供帮助:

select * from tablename order by columnname offset 20 rows fetch next 40 rows only

它将第21行视为第1行,并从第21行中获取接下来的40行。

答案 5 :(得分:0)

选择* from(选择row_number()over(按Column_name排序)为Num,Col_name1,Col_name2,来自table_name的Col_name3) Table_name其中Num> 5且Num< 10;

例如:

从emp中选择*;

SQL> select * from emp;

 EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
  7369 SMITH      CLERK           7902 17-DEC-80        800                    20
  7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
  7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
  7566 JONES      MANAGER         7839 02-APR-81       2975                    20
  7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
  7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
  7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
  7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
  7839 KING       PRESIDENT            17-NOV-81       5000                    10
  7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
  7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
  7900 JAMES      CLERK           7698 03-DEC-81        950                    30
  7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
  7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

选择了14行。

SQL>选择* from(选择row_number()over(按empno排序)为Num,ename,empno,deptno,sal from emp)  emp,其中Num> 5且Num< 10;

   NUM ENAME           EMPNO     DEPTNO        SAL
     6 BLAKE            7698         30       2850
     7 CLARK            7782         10       2450
     8 SCOTT            7788         20       3000
     9 KING             7839         10       5000

SQL>