【发布时间】:2009-10-14 02:55:04
【问题描述】:
在 ms 访问中 mysql Limit 的等价物是什么。 TOP 是不够的,因为我将使用它进行分页。
谢谢
【问题讨论】:
-
如果您打算使用分页来生成报告,那么您最好使用 ms-access 的报告生成功能。
-
我想说,如果你需要这个,你使用了错误的数据库引擎,因为这是一个适当有用的功能的环境是 Jet/ACE 大多不合适的环境。
在 ms 访问中 mysql Limit 的等价物是什么。 TOP 是不够的,因为我将使用它进行分页。
谢谢
【问题讨论】:
没有。你最好的办法是添加一个 ID 列作为主键(如果你还没有的话)并通过循环来分块输出:
SELECT * FROM table
WHERE id >= offset AND id <= offset + chunk_size - 1
直到你得到所有的行。
【讨论】:
TOP chunksize WHERE id > max_id_of_previous_page ORDER BY id吗?
奇怪的是,Microsoft 文档中有几处引用了 Access 数据库引擎的 LIMIT TO nn ROWS 语法:
About ANSI SQL query mode (MDB)
但是,实际测试似乎证实了此语法在 Access 数据库引擎的发布版本中从未存在过。也许这是 SQL Server 团队想要放入 Jet 4.0 但被 Windows 团队命令回滚的那些功能之一?不管怎样,看来我们必须简单地将其归结为微软不会花时间纠正的错误文档错误:(
如果您需要在服务器**端进行分页,那么我建议您考虑一个功能更强大、具有更好文档的现代 SQL 产品;)
** 在概念上,即:Access 数据库引擎不是服务器 DBMS。
【讨论】:
由于这些行似乎没有任何类型的顺序唯一键编号,因此您需要创建一个排名列:How to Rank Records Within a Query
您需要确定一次将返回多少行 N = (10, 25,100)。
您需要跟踪用户所在的“页面”以及第一个和最后一个排名的值。
然后,当您调用下一页时,接下来的 N 行是 > 或
我确定有一种方法可以计算最后一页、第一页等。
【讨论】:
使用TOP关键字实现类似于Limit语句的分页SQL的唯一方法如下:
第一步:
sql = "select top "&LESS_COUNT&" * from (SELECT top "&(PAGE_COUNT*getPage)&" * FROM (SELECT "&COLUMNS&" FROM "&TABLENAME&") AS TBL "&getWhere&getOrderby("asc")&") as TBL "&getOrderby("desc")
第二步:
sql = "SELECT TOP "&PAGE_COUNT&" * FROM (" & sql & ") as TBL "&getOrderby("asc")
总结;您应该重新排序并将结果倒置 3 次。
【讨论】:
将您的项目移植到 PHP 和 MySQL。更好地支持这些类型的操作和查询以及更好的在线文档。作为一名 16 年的资深数据库开发人员,我已经以一种其他任何事物都无法比拟的热情来鄙视 MS Access 和 MS SQL。这完全是由于他们缺乏支持和文档。
【讨论】: