为了账号安全,请及时绑定邮箱和手机立即绑定

在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 关注
  • 666 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信