程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 用一句SQL取出第 m 條到第 n 條記錄的方法

用一句SQL取出第 m 條到第 n 條記錄的方法

編輯:關於SqlServer
從Table 表中取出第 m 條到第 n 條的記錄:(Not In 版本)
  
  SELECT TOP n-m+1 * 
  FROM Table 
  WHERE (id NOT IN (SELECT TOP m-1 id FROM Table ))  
  
  
  --從TABLE表中取出第m到n條記錄 (Exists版本)

"COLOR: #008080">
  
 SELECT TOP n-m+1 * FROM TABLE AS a WHERE Not Exists
 (Select * From (Select Top m-1 * From TABLE order by id) b Where b.id=

="COLOR: #000000">a.id ) 
 Order by id
 
 
 --m為上標,n為下標,例如取出第8到12條記錄,m=8,n=12,Table為表名
 
 Select Top n-m+1 * From Table 
 Where Id>(Select Max(Id) From 
 (Select Top m-1 Id From Table 

OR: #0000ff">Order By Id Asc) Temp) 
 Order By Id Asc  

直接取得數據庫中的分頁記錄
前提是表中必須有主鍵

取得第M條記錄之後的N條記錄:
SELECT TOP N *
FROM [TABLE]
WHERE (ID NOT IN
(SELECT TOP M id
FROM [TABLE]
ORDER BY [ORDER]))
ORDER BY [ORDER]

Oracle中的實現,取得第M到N條記錄: SELECT * FROM
(
SELECT * , ROWNUM AS CON FROM
(
SELECT * FROM [TABLE] ORDER BY [ORDER]
)
WHERE ROWNUM <= N
)
WHERE CON >= M;

查詢表中連續的某幾條記錄
不要傳任何列的條件參數,查詢表中連續的某幾條記錄
如:表A,id列為主鍵
id name sex age
-------------------------
1 luoyi male 21
2 yaya female 20
3 lili female 22
4 wuyong male 25
.......................

這個表的記錄還有很多,如果我想取第二、第三條記錄,不為別的,我就想要這兩條,這不僅在編程中會用到,而且在一些公司面試時也有類似考題(呵呵,我沒有遇到過),在Oracle和mssqlserver中SQL代碼分別為:

一、Oracle
在Oracle中不能用top關鍵字,而用rownum,有兩種方法可以實現
1.(select * from A where rownum <= 4) minus (select * from A where rownum <= 1)
這樣就得到了二、三兩條記錄了。minus 關鍵字的意思是求兩個結果集的差集,在數學中有這個概念,比如說兩個集合可以合並、公有、差集.
2. select * from (select * from A where rownum < 4) b where b.id not in(select id from A where rownum <2)  這句代碼也可以實。主要運用了not in運算符

二、ms SQL Server
在server中沒有minus,只能用類似於Oracle的第二種方法
select * from (select top 3 * from A) as b where b.id not in(select top 1 id from A)
三、繪制出來的結果為:
id name sex age
--------------------------------
2 yaya female 20
3 lili female 22

特點:一次查詢,數據庫只返回一頁的數據。而不是取出所有的數據。
說明:

pagesize: 每頁顯示記錄數
cureentpage:當前頁數

br />select * from ( select TOP pagesize * FROM ( SELECT TOP pagesize*cureentpage * from user_table ORDER BY id ASC ) as aSysTable ORDER BY id DESC ) as bSysTable ORDER BY id ASC


例子說明:

假如數據庫表如下:

user_table:

id:主鍵,自增
username:字符
passWord:字符

假設有80條記錄,每頁顯示10條記錄,id 從1到80


現在按照id升序排列取出第三頁的數據應該為:所取得記錄的id 應該為 21到30。

這時該語句應該為:

select * from ( select TOP 10 * FROM ( SELECT TOP 30 * from user_table ORDER BY id ASC ) as aSysTable ORDER BY id DESC ) as bSysTable ORDER BY id ASC

原理如下:

先按照id從小到大升序取出30條記錄(3*10),也就是:id 在 1-30 之間的記錄 (SELECT TOP 30 * from user_table ORDER BY id ASC)

然後按照ID降序排列這30條記錄,得到記錄為id 在:從30到 1

然後在這些30條記錄中取出前10條記錄:取得的記錄為:id 在30-21之間。這就是我們需要的數據,但這時是按照降序排列的,不符合要求。

最後在重新排序得到最終我們需要的數據。id在21-30之間。



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved