亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Microsoft SQL Server 2000中模擬MySQL LIMIT子句

在Microsoft SQL Server 2000中模擬MySQL LIMIT子句

函數式編程 2019-10-18 15:08:15
當我處理Zend Framework的數據庫組件時,我們嘗試抽象化LIMITMySQL,PostgreSQL和SQLite支持的子句的功能。也就是說,可以通過以下方式創建查詢:$select = $db->select();$select->from('mytable');$select->order('somecolumn');$select->limit(10, 20);當數據庫支持時LIMIT,將生成如下所示的SQL查詢:SELECT * FROM mytable ORDER BY somecolumn LIMIT 10, 20對于不支持的數據庫品牌來說,這更為復雜LIMIT(順便說一句,該子句不是標準SQL語言的一部分)。如果您可以生成行號,則使整個查詢成為派生表,并在外部查詢中使用BETWEEN。這是針對Oracle和IBM DB2的解決方案。Microsoft SQL Server 2005具有類似的行號功能,因此可以通過以下方式編寫查詢:SELECT z2.*FROM (    SELECT ROW_NUMBER OVER(ORDER BY id) AS zend_db_rownum, z1.*    FROM ( ...original SQL query... ) z1) z2WHERE z2.zend_db_rownum BETWEEN @offset+1 AND @offset+@count;但是,Microsoft SQL Server 2000沒有該ROW_NUMBER()功能。因此,我的問題是,您能否提出一種LIMIT僅使用SQL 來模擬Microsoft SQL Server 2000中的功能的方法?無需使用游標或T-SQL或存儲過程。它必須同時支持LIMITcount和offset的兩個參數。使用臨時表的解決方案也不可接受。編輯:MS SQL Server 2000的最常見解決方案似乎類似于以下解決方案,例如獲取第50至75行:SELECT TOP 25 *FROM (   SELECT TOP 75 *  FROM   table   ORDER BY BY field ASC) a ORDER BY field DESC;但是,如果總結果集為60行,則此方法不起作用。內部查詢返回60行,因為它位于前75位。然后外部查詢返回35-60行,該行不適合所需的50-75“頁面”?;旧?,該解決方案有效,除非您需要結果集的最后“頁面”恰好不是頁面大小的倍數。
查看完整描述

3 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

SELECT TOP n *

FROM tablename

WHERE key NOT IN (

    SELECT TOP x key

    FROM tablename

    ORDER BY key

    DESC

);


查看完整回答
反對 回復 2019-10-18
?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

這是僅在Sql Server 2005及更高版本中有效的另一種解決方案,因為它使用except語句。但是我還是分享。如果要獲取記錄50-75,請輸入:


select * from (

    SELECT top 75 COL1, COL2

    FROM MYTABLE order by COL3

) as foo

except

select * from (

    SELECT top 50 COL1, COL2

    FROM MYTABLE order by COL3

) as bar


查看完整回答
反對 回復 2019-10-18
?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

僅在需要LIMIT時,ms sql具有等效的TOP關鍵字,因此很清楚。當您需要使用OFFSET進行LIMIT時,您可以嘗試使用如前所述的一些技巧,但是它們都會增加一些開銷,例如,用于訂購一種方式然后再訂購另一種方式,或者昂貴的NOT IN操作。我認為不需要所有這些級聯。在我看來,最干凈的解決方案是在SQL端使用無偏移的TOP,然后使用適當的客戶端方法(如php中的mssql_data_seek)尋求所需的起始記錄。盡管這不是純SQL解決方案,但我認為這是最好的解決方案,因為它不會增加任何開銷(跳過的記錄在您經過它們時將不會在網絡上傳輸,如果您擔心的話) )。


查看完整回答
反對 回復 2019-10-18
  • 3 回答
  • 0 關注
  • 798 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號