在 Access 子报表中使用 top 子句

Posted

技术标签:

【中文标题】在 Access 子报表中使用 top 子句【英文标题】:Using top clause in Access sub report 【发布时间】:2008-10-08 14:19:51 【问题描述】:

我正在 Access 2003 中制作一份报告,其中包含相关记录的子报告。在子报告中,我只想要前两条记录。当我将“TOP 2”添加到子报表的查询中时,似乎在过滤链接字段之前选择了前两条记录。如何获取仅适用于相应链接字段的那些记录的前两条记录?谢谢。

【问题讨论】:

【参考方案1】:

下面的示例查询应该为每个客户返回一对最近的订单(而不是所有订单):

select
    Order.ID,
    Order.Customer_ID,
    Order.PlacementDate
from
    Order
where
    Order.ID in 
        (
            select top 2
                RecentOrder.ID
            from
                Order as RecentOrder
            where
                RecentOrder.Customer_ID = Order.Customer_ID
            order by
                RecentOrder.PlacementDate Desc
        )

可以在您的子报告中使用这样的查询来避免使用临时表。

CAVEAT EMPTOR:我没有测试这个示例查询,我不知道这个查询是否适用于针对 Jet 数据库运行的报告(我们不使用 Access 来存储数据,我们避免像瘟疫这样的 Access 报告: -)。但它应该针对 SQL Server。

我也不知道它在你的情况下表现如何。像往常一样,这取决于。 :-)

顺便说一句,说到性能和技巧。我不会认为使用临时表是一种黑客行为。在最坏的情况下,这个技巧可以被认为是一个比报告更复杂的接口。 :-) 而且使用这样的临时表实际上可能是提高性能的好方法之一。所以,不要着急把它写下来。 :-)

【讨论】:

这不应该是公认的答案吗?它适用于 JetEngine。【参考方案2】:

我有两个建议: 1)将您的主字段(在父表单上)作为参数传递给查询(您也可以直接引用父表单上的字段) 2)您可以在 Access 中伪造行号并将它们限制为仅 rownum

SELECT o1.order_number, o1.order_date,
    (SELECT COUNT(*) FROM orders AS o2
        WHERE o2.order_date <= o1.order_date) AS RowNum
    FROM
        orders AS o1
    ORDER BY o1.order_date 

(来自http://groups.google.com/group/microsoft.public.access.queries/msg/ec562cbc51f03b6e?pli=1) 但是,这种查询可能会返回一个只读记录集,因此如果您需要在表单而不是报表上执行相同的操作,它可能不适合。

【讨论】:

我不能说您的解决方案是否有效,但在报告中您当然不必担心返回只读记录集! :) D.F.你是绝对正确的。我当时正在考虑 Forms。 CodeSlave:感谢您的意见。我做了一个变通方法,在打开报表之前,我将所有相关记录(每种类型的前 2 个)放在一个表中,并将其用作子报表的记录源。这有点骇人听闻,但确实有效。 CodeSlave:想法#2 很有创意,但它有两个小问题:查询返回所有订单中的两个或多个最旧的订单(不完全是每个客户的两个最旧的订单)。 OTOH,第一个问题可能被宣布为一个有用的功能。 :-)

以上是关于在 Access 子报表中使用 top 子句的主要内容,如果未能解决你的问题,请参考以下文章

滚动到表单中的子报表底部 (Access 2016)

确定子表单/子报表是不是在 MS Access 中加载了表单或报表

怎么使用和创建水晶报表 子报表?

Access 2007 - 从子子报表引用子报表值

如何在WHERE子句中使用MS Access SQL子查询来替换长OR表达式

MS Access:将参数传递给不带 SQL 的子报表