2011-03-30 64 views
5

希望標題解釋了它足夠的,但我希望能夠在兩個值SQL Server的兩個值

例如

SELECT * FROM table WHERE rows between 20 and 60

我之間選擇一個SQL Server錶行之間選擇行試過ROW_NUMBER(),然後使用WHERE子句....

謝謝,

傑森

回答

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

由於select語句可以按任何順序返回記錄(沒有order by子句),你需要決定適用的以記錄......如果你不使用主鍵的輸出「知道或護理(替代XX)

+2

+1。這個雙「頂」模式始終有效。 – RollingBoy 2011-03-30 01:56:38

+1

一個有趣的+1,不包括@RollingBoy的投票。 – Hogan 2011-03-30 02:06:35

+0

+1這適用於SQL 2000轉發。但請注意,數據將以相反的順序。爲了得到正確的順序,你需要將上面的代碼封裝在'SELECT * FROM()t2 ORDER BY xx ASC.' – 2011-03-30 02:47:38

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

感謝法眼,但我想這個早了,我得到這個錯誤 'ROW_NUMBER' 不是可以識別的函數名。 – neolaser 2011-03-30 01:51:15

+1

@neolaser - 你使用的是什麼版本的sql server? – Hogan 2011-03-30 01:52:59

+2

我相信ROW_NUMBER是在SQL Server 2005中引入的.OP沒有指定正在使用的SQL Server版本 – 2011-03-30 02:01:17

2

在SQL的早期版本,一個選擇是使用臨時表:

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

SELECT * 
FROM #Temp 
WHERE RowNumber between 20 and 60 
3

如果您有SQL Server 2012中(或更高版本),你可以使用偏移 - 爲此獲取。
看到這個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 
0

SELECT *行(選擇ROW_NUMBER()OVER(ORDER BY列名)作爲民,Col_name1,Col_name2,Col_name3從TABLE_NAME) Table_name其中Num> 5和Num < 10;

例如:

Select * from 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> SELECT * FROM(SELECT ROW_NUMBER()以上(由EMPNO順序)貨號,ENAME,EMPNO,DEPTNO,從EMP SAL) 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>