给出显示的表格(简化):
如何以最快的方式选择主表中的记录,其中“相关表”中的所有相关记录都已完成(= true),最新的“CompletedTimestamp”值每个订单都大于/小于指定值?
如果我希望在2013年8月20日之前完成订单,则应返回OrderId = 1的单条记录。
数据库是MS Access,但是我使用SQL和ADO.NET从另一个系统引用它。
答案 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'
将确保只返回在指定日期之前具有最长完成日期的订单。