如何在访问中选择行m到n?

时间:2017-11-03 17:23:23

标签: sql ms-access

我正在修改Access 2016中的子报表查询,需要选择一组行,而不是所有行。默认情况下,生成的查询如下所示:

SELECT table_name.a, table_name.b, table_name.c
FROM table_name
WHERE (((table_name.dist_ft)<3001));

如何通过 n 而不是所有行仅选择行 m

感谢您的见解! ...... [编辑]

另一个澄清 - 当我运行像

这样的查询时

选择TOP 16 * FROM table_name WHERE(((table_name.dist_ft)&lt; 3001));

...或者我尝试使用TOP的任何其他变体我的子报告都没有填充。它仅包含选择所有字段且未使用TOP时的数据。我一定错过了什么。

3 个答案:

答案 0 :(得分:0)

ID是您的“行号”吗?

SELECT table_name.a, table_name.b, table_name.c 
FROM table_name 
WHERE table_name.dist_ft<3001
AND table_name.ID>=m
AND table_name.ID<=n
;

根据评论更新了一般案例 -

Select table_name.a, table_name.b, table_name.c from tablename 
where tablename.id in 
(select top n tablename.id from tablename) 
and tablename.id not in 
(select top m tablename.id from tablenane)

答案 1 :(得分:0)

记录m到n是记录1到n减去记录1到m-1。请注意,TOP子句需要EXCEPT子句才有意义。

以下是m = 31到n = 40的示例以及所有三个所选列的顺序。 MS Access不支持IN,因此我们无法减去两个数据集,这将是直截了当的方式。我们还可以将所需结果表示为前n个,其中(a,b,c)不在顶部m-1中,但MS Access也不支持多列上的dist_ft子句。所以我在这里使用反连接(我选择where (id) not in (select top 30 id ...),但它可以是表中任何不可为空的列。)

如果您的表具有唯一ID列,则可以使用更具可读性的WHERE而不是反连接。以任何方式确保将相同的dist_ft < 3001子句(在您的情况下为ORDER BY)和ORDER BY a, b, c子句(例如SELECT TOP 40 a, b, c FROM table_name t LEFT JOIN ( SELECT TOP 30 a, b, c, dist_ft FROM table_name WHERE dist_ft < 3001 ORDER BY a, b, c ) no ON no.a = t.a AND no.b = t.b AND no.c = t.c WHERE t.dist_ft < 3001 AND no.dist_ft is null ORDER BY t.a, t.b, t.c; )应用于主查询和子查询。

void reverse() {
    // Base case
    if (isEmpty()) return;

    // Get head
    T head = dequeue();
    // Reverse everything else
    reverse();
    // Add head after reversion of everything else
    enqueue(head);
}

MS Access因多个联接需要额外的括号而闻名。我不能说上面的查询是否可以直接使用,或者是否必须在某处添加parantheses。

答案 2 :(得分:0)

你排序三次以获得你所追求的结果。让我们说我们想要第31到40行:

  1. 排序并获得前40名
  2. 按相反顺序排序并获得前10名
  3. 再次排序以获得您真正想要的订单
  4. 查询:

    SELECT a, b, c
    FROM
      SELECT TOP 10 a, b, c
      FROM
      (
        SELECT TOP 40 a, b, c
        FROM table_name
        WHERE t.dist_ft < 3001
        ORDER BY a, b, c
      ) top_n
      ORDER BY a desc, b desc, c desc
    ) top_m_to_n
    ORDER BY a, b, c;