给定显示的表格(简化):
我如何以最快的方式选择主表中的记录,其中“相关表”中的所有相关记录都已完成(=true)并且每个订单的最新“CompletedTimestamp”值大于/小于指定值?
如果我希望在 2013 年 8 月 20 日之前完成已完成的订单,则应返回 OrderId = 1 的单个记录。
该数据库是 MS Access,但我使用 SQL 和 ADO.NET 从另一个系统引用它。
关键是用来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)
将计算非 null CompletedTimestamps(因为COUNT(NULL)
= 0),这将仅返回所有相关记录都被强制执行的订单。
最后,该声明MAX(CompletedTimestamp) < '20130821'
将确保仅返回指定日期之前最大完成日期的订单。