【问题标题】:How to select rows m through n in access?如何在访问中选择行 m 到 n?
【发布时间】:2017-11-03 17:23:23
【问题描述】:

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

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

如何只选择行 mn 而不是所有行?

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

附加说明 - 当我像这样运行查询时

选择前 16 个 * FROM 表名 WHERE (((table_name.dist_ft)

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

【问题讨论】:

  • MS Access LIMIT X, Y 的可能重复项具有所需顺序的简单两个顶级嵌套查询(派生表)。或获取前 n 个 ID 不在前 m 中的位置

标签: sql ms-access


【解决方案1】:

这里是你的“行号”吗?

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
;

根据 cmets 更新了更一般的情况-

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)

【讨论】:

  • 感谢您的回复。 “ID”是 table_name 中的一个字段,即它不是行号。是否有可能是行号的系统字段?在您回复的后半部分,我理解了您的建议;但是,我无法让 SELECT TOP 16 table_name.a, table_name.b, table_name.c ... 工作!似乎拥有 a、b、c 等正在摆脱 TOP。我一直在其他论坛上看到的 TOP 示例只有一个,例如表名.a。再次感谢。
  • 对不起,最后匆匆忙忙。 select a,b,c from tablename where id in (select top n id from tablename) and id not in (select top m from tablenane)
【解决方案2】:

记录 m 到 n 是记录 1 到 n 减去记录 1 到 m-1。请注意,您需要一个 ORDER BY 子句才能使 TOP 子句有意义。

这是一个示例,其中 m = 31 到 n = 40,并且所有三个选定列的顺序。 MS Access 不支持EXCEPT,因此我们不能减去这两个数据集,这将是直接的方法。我们还可以将所需的结果表示为前 n,其中 (a,b,c) 不在前 m-1 中,但 MS Access 也不支持多列上的 IN 子句。所以我在这里使用了反连接(为此我选择dist_ft,但它可以是表的任何不可为空的列)。

如果您的表有唯一的 ID 列,您可以使用更易读的where (id) not in (select top 30 id ...) 而不是反连接。无论如何,请确保将相同的WHERE 子句(在您的情况下为dist_ft &lt; 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;

MS Access 以在多个连接上需要额外的括号而闻名。我不能说上面的查询是立即起作用还是必须在某处添加括号。

【讨论】:

    【解决方案3】:

    你排序三次以获得你想要的结果。假设我们想要第 31 到 40 行:

    1. 排序并获得前 40 名
    2. 倒序排列,获得前10名
    3. 再次排序以获得您真正想要的顺序

    查询:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      相关资源
      最近更新 更多