SQL的最快方法是根据MS Access中另一个表(一对多)中多个相关记录的值选择记录?

时间:2013-08-13 08:19:33

标签: sql ms-access

给出显示的表格(简化):

Tables

如何以最快的方式选择主表中的记录,其中“相关表”中的所有相关记录都已完成(= true),最新的“CompletedTimestamp”值每个订单都大于/小于指定值?

如果我希望在2013年8月20日之前完成订单,则应返回OrderId = 1的单条记录。

数据库是MS Access,但是我使用SQL和ADO.NET从另一个系统引用它。

1 个答案:

答案 0 :(得分:1)

关键是使用HAVING来限制记录,而不是WHERE

假设CompletedTimestamp为NULL,订单未完成,您可以使用:

SELECT  m.OrderID, m.Owner, MAX(r.CompletedTimestamp) AS CompletedDate
FROM    [Main Table] m
        INNER JOIN [Related Table] r
            ON r.OrderID = m.OrderID
GROUP BY m.OrderID, m.Owner
HAVING  COUNT(r.CompletedTimeStamp) = COUNT(*)
AND     MAX(r.CompletedTimestamp) < '20130821';

由于COUNT(*)将计算所有记录,COUNT(CompletedTimestamp)将计算非空的CompletedTimestamps(因为COUNT(NULL) = 0),这将仅返回强制所有相关记录的订单。

最后,语句MAX(CompletedTimestamp) < '20130821'将确保只返回在指定日期之前具有最长完成日期的订单。