MS Access LIMIT X,Y

grj*_*jj3 5 ms-access

是否可以模拟以下MySQL查询:

SELECT * FROM `tbl` ORDER BY `date` DESC LIMIT X, 10
Run Code Online (Sandbox Code Playgroud)

(X是参数)

在MS Access?

Ste*_*sen 12

虽然Access/JET TOP关键字不直接提供OFFSET功能,但我们可以使用TOP子查询和"派生表" 的巧妙组合来获得相同的结果.

以下是在NameId中的Person表中从偏移量20开始获取10行的示例...ORDER BY

SELECT Person.*
FROM Person
WHERE Person.Id In 
      (
        SELECT TOP 10 A.Id
        FROM [
               SELECT TOP 30 Person.Name, Person.Id
               FROM Person
               ORDER BY Person.Name, Person.Id
             ]. AS A
        ORDER BY A.Name DESC, A.Id DESC
      )
ORDER BY Person.Name, Person.Id;
Run Code Online (Sandbox Code Playgroud)

基本上,我们查询前30个,反转顺序,查询前10个,然后从表中选择匹配的行,再次按顺序排序.这应该是相当有效的,假设IdPRIMARY KEY,并且Name上有索引.可能是Name,Id上的特定覆盖索引(而不是名称上的一个)才能获得最佳性能,但我认为索引隐含地覆盖了PRIMARY KEY.


The*_*nim 5

另一种方式 - 假设您希望在名为 table1 的表中包含 1000 到 1999 条记录(当然,如果您有那么多记录),您可以执行以下操作。

MSSQL

SELECT *
    FROM table1 LIMIT 1000, 1999;
Run Code Online (Sandbox Code Playgroud)

微软访问

SELECT TOP 1000 * 
FROM table1 
Where ID NOT IN (SELECT TOP 999 table1.ID FROM table1);
Run Code Online (Sandbox Code Playgroud)

打破这个

SELECT TOP NumA * 
FROM table1 
Where ID NOT IN (SELECT TOP NumB table1.ID FROM table1);

UpperLimit = 1999

LowerLimit = 1000

NumA = UpperLimit - LowerLimit + 1
Run Code Online (Sandbox Code Playgroud)

前任。1000 = 1999 - 1000 + 1

NumB = LowerLimit -1
Run Code Online (Sandbox Code Playgroud)

前任。999 = 1000 - 1