当我处理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 ) z2 WHERE 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“页面”。基本上,该解决方案有效,除非您需要结果集的最后“页面”恰好不是页面大小的倍数。
编辑:
另一个解决方案效果更好,但前提是您可以假设结果集包含唯一的列:
SELECT TOP n * FROM tablename WHERE key NOT IN ( SELECT TOP x key FROM tablename ORDER BY key ); 结论:
似乎没有通用的解决方案可以LIMIT在MS SQL Server 2000中进行仿真。如果可以ROW_NUMBER()在MS SQL Server 2005中使用该功能,则可以找到一个好的解决方案。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这是仅在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来源:stack overflow