在Access子报告中使用top子句

时间:2008-10-08 14:19:52

标签: sql ms-access

我在Access 2003中创建一个包含相关记录子报告的报告。在子报告中,我只想要前两个记录。当我向子报表的查询添加“T​​OP 2”时,它似乎在链接字段上过滤之前选择前两个记录。如何仅获取适用于相应链接字段的那些记录的前两个记录?感谢。

2 个答案:

答案 0 :(得分:2)

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

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。

我也不知道你的情况会有多好。像往常一样,这取决于。 : - )

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

答案 1 :(得分:1)

我有两个建议:
1)将您的主域(在父窗体上)作为参数传递给查询(您也可以直接引用父窗体上的字段)
2)您可以伪造出Access中的rownumbers并将它们限制为仅rownum< = 2.例如,

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
但是,这种查询可能会返回一个只读记录集,因此如果您需要在表单而不是报表上执行相同操作,则可能不会使用它。