對查詢資料庫中第M到N條記錄的思考

iDotNetSpace發表於2008-09-25
 呵呵,以前聽莊明學長說過查詢資料庫中第M到N條記錄的好多種方法,自己為是那樣,但是從來沒有實踐過,今天學到Sql server 2005 的查詢語句了,於是就想來實踐實踐自己的想法!

      首先我要宣告一下,我在後文中寫到的查詢前提是表中已經有一個自動增長的欄位了.主要是利用它完成查詢的.如果要被查詢的表中沒有這個欄位我們可以想辦法去構建這個欄位,呵呵,這只是我的一個想法,具體做法我還將進一步研究!

     請大家先看看我的這長表:

    create table test1

  (

        _id int identity primary key,

       num  int,

        strnum varchar(10),

  )

   然後我向這張表中插入了55000條記錄.

   現在我要查詢它裡面的第20到第40條記錄:

   在網上找發好多資料,也在群裡問了好多朋友:

 

   大致找到了以下幾種法:

  法一: select top 20 * from test1 where _id not in(select top 20 _id from test1) --這條語句也挺簡單的,但其中使用了 not 關鍵字,一般情況是不使用的,因為它會降低資料庫檢索速度!

 法二:

  select * from
(
 select top 21 * from
  (select top 40 * from test1 order by _id ) t
  order by _id desc
)   t order by _id

這個方法是我比較匯滿意的方法,因為它沒有使用 not 關鍵字,也沒有使用臨時表(它會產生資料庫鎖定,從而降低效率).

 

法三:

 select top  20*  from
(
   select top 55900 * from test1 order by _id desc
) t order by _id

這個法其它與法二是一模一樣的,只是它是倒查的,原理是一樣的.資料庫中總記錄是55920條記錄.我想用上面那種方法不用去考慮總記錄數

 

法四:

select top 40 *  into tempTabel from  test1 order by _id

select top 20 * into myTemp from tempTabel order by _id  desc

select  * from myTemp order by _id asc

drop table tempTabel

drop table myTemp

這個方法使用了臨時表,在中小型網站中使用還可以,但大訪問量的網站中,我想是不合適的.

 

  終上所述,本人建議還是使用第二種方法. 同時希望與大家一起研究沒有 _id 這個欄位的表中查詢第M到N條記錄.....

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-464309/,如需轉載,請註明出處,否則將追究法律責任。

相關文章