我正在修改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时的数据。我一定错过了什么。
答案 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行:
查询:
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;