在Microsoft Access中选择除了前10个之外的所有数据。

12

假设我有一个查询

SELECT TOP 10 ... FROM ... ORDER BY ...

在 Access(实际上是 Jet 引擎)中,问题是:如何获取除前 10 行以外的所有其他行?

4个回答

24

你不能做类似这样的事情吗?

SELECT ... FROM ...
WHERE PK NOT IN (SELECT TOP 10 PK FROM ...)
ORDER BY ...

这可能不是非常高效,但这是我能想到的唯一做法。据我所知,SQL中没有“BOTTOM”子句 :)


这曾经是我面试时被问到的问题。我以类似的方式回答了。 - Varun Mahajan

6
SELECT ... FROM ....
WHERE myID NOT IN 
    (SELECT TOP 10 myID FROM ... ORDER BY rankfield)
ORDER BY sortfield

请注意,您的排序顺序可以(如果您希望)与您的排名顺序不同。
编辑:另一个想法:如果您已经知道了总行数,您可以执行以下操作(假设有1000行):
SELECT TOP 990 ... FROM .... ORDER BY sortfield DESC

只需将排序翻转,然后取剩余部分即可。

当然,如果您仍希望结果以原始顺序呈现,那么您必须执行一些愚蠢的操作,例如:

SELECT ... 
FROM (SELECT TOP 990 ... FROM .... ORDER BY sortfield DESC)
ORDER BY sortfield ASC

我期望后者比NOT IN更快,因为NOT IN不能有效地使用索引。实际上,使用DCount()获取记录数,然后获取其余记录可能更快。 - David-W-Fenton

3

您可以创建一个排名字段 (创建排名列的方法) 并基于此进行过滤: where rank >10

您可以创建一个“排名”字段,然后根据该字段进行筛选: where rank >10。


3

在处理IT技术相关内容时,更好的做法通常是在“客户端”而不是DBMS上进行,即将表中所有行提取到ADO Classic记录集中,然后使用过滤器属性基于条件删除10行,或者排序,然后设置跳过第一个/最后10行,或者根据需要设置页面长度,然后跳过第一个/最后一页等。这不仅取决于行数,还取决于目标应用程序,例如我知道,如果这是MS Access报告的数据源,则过滤掉不需要的行可能会很麻烦。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接