返回完成日期大于前一个记录的下一个截止日期的所有记录?

时间:2011-12-13 01:56:19

标签: sql ms-access-2010

好的,因为数据库的设计很差,这感觉就像一个复杂的查询,但是唉 - 它就在那里,需要解决。该表有5个字段:id(PK),itemNumber(FK),completedDate,completedBy(FK),nextDue。

在应用程序中,当有人将任务记录为已完成时,它会填写completedDate,计算下一个截止日期并将其放入nextDue。

我需要的是一个查询,它基本上会查看记录的nextDue日期,然后查看具有相同itemNumber的下一条记录,并与该completedDate进行比较;如果completedDate超过completedBy日期,则返回该行。那有意义吗?可以这样做吗?听起来它必须在程序上与纯sql完成。 TIA

UDPATE: 我想我应该更具体一点。我需要在报表中使用此查询,因此如果需要在VBA中完成,我不确定如何将结果导入到该报表中。

enter image description here

1 个答案:

答案 0 :(得分:1)

我发现考虑这些奇怪查询的最佳方法是在我的脑海中将它们分解为更小的可管理查询。因此,我认为这是首先关联并比较两个记录:“当前”和“下一个”记录。我们要做的第一件事就是将每条记录(将成为“当前”)与其相应的“下一条”记录相关联。

首先,查询获取所有记录ID及其对应的“下一条记录”。这使用小于“<”在JOIN语句中获取当前记录之后的所有记录。

SELECT
     T.id as currentId,
     MIN(A.id) as nextId
FROM
     rec_completionDate as T
          JOIN
     rec_completionDate as A ON T.itemNumber = A.itemNumber and T.id < A.id
GROUP BY
     T.id

跟进一个查询,使用上面的子查询返回每条记录的所有相应字段(当前和下一个):

SELECT
     current.*,
     next.*
FROM
     ( ... [subquery goes here] ...) sq
          JOIN
     rec_completionDate as current ON sq.currentId = current.id
          JOIN
     rec_completionDate as next ON sq.nextId = next.id

最后,我们要使用以下WHERE子句限制最后一个查询的结果:

WHERE
     next.completedDate > current.nextDue

所以,把它们放在一起:

SELECT
     current.*,
     next.*
FROM
     ( 
     SELECT
          T.id as currentId,
          MIN(A.id) as nextId
     FROM
          rec_completionDate as T
               JOIN
          rec_completionDate as A ON T.itemNumber = A.itemNumber and T.id < A.id
     GROUP BY
          T.id
     ) sq
          JOIN
     rec_completionDate as current ON sq.currentId = current.id
          JOIN
     rec_completionDate as next ON sq.nextId = next.id
WHERE
     next.completedDate > current.nextDue