搜索最大日期并返回最大日期项以及该记录的其他字段

时间:2018-05-04 09:09:16

标签: sql ms-access

我有三张桌子:

  • 包含已在MaintItem上完成的所有工作订单的WorkOrder(一个MaintItem将在WorkOrder表中多次出现)

  • 包含Unique MaintItem列表的MaintItems,

  • LastOccu用于存储MaintItem的WorkOrder表中的上次出现详细信息。

标识执行MaintItem的最后日期,并使用MaxDate和MaintItem正确填充LastOccu表。我遇到的问题是当我想用额外的WorkOrder Number字段更新lastOccu表时,查询然后返回该MaintItem的所有WorkOrders。

  

WorkOrder表示例:

WorkOrder MaintItem   RefDate     Reading
1         101         2018/01/30  200
2         103         2018/02/03  1200
3         101         2018/02/04  230

需要LastOccu表结果:

MaintItem MaxDate    WONumber Reading
101       2018/01/30 3        230
103       2018/02/03 2        1200

我需要帮助的查询如下:

INSERT INTO LastOccu ( MaintItem, MaxDate, WONumber, ReadingNo )
SELECT MD.MaintItem, MD.MaxRefDate, MD.WONumber, MD.ReadingNo
FROM 
(SELECT MI.MaintItem, MAX(WO.RefDate) AS MaxRefDate, WO.WONumber,
WO.ReadingNo FROM MaintItem AS MI INNER JOIN WorkOrder AS WO ON 
MI.MaintItem = WO.MaintItem WHERE WO.RefDate is not null GROUP BY
MI.MaintItem, WO.WONumber, WO.ReadingNo)  AS MD;

还请注意我正在使用MS Access

非常感谢帮助!

2 个答案:

答案 0 :(得分:0)

我没有看到加入MaintItem表的必要性。每个工作单应该已经有一个相应的MaintItem条目,不是吗?如果没有,那么加入(是WorkOrder或WONumber,我无法理解)。

INSERT INTO LastOccu(MaintItem, MaxDate, WONumber, ReadingNo)
SELECT wo.MaintItem, wo.RefDate, wo.Workorder, wo.ReadingNo
FROM WorkOrder wo
     INNER JOIN(
               SELECT MaintItem, MAX(RefDate) AS MaxRefDate
               FROM WorkOrder
               WHERE RefDate IS NOT NULL
               GROUP BY MaintItem
               ) AS MD ON wo.MaintItem=MD.MaintItem
                      AND wo.RefDate=MD.MaxRefDate;

注意:糟糕,我错过了你从sql server到MSAccess的标签更改。这不支持ANSI SQL,但至少应该支持我假设的这种简单的,所以不要删除。 (你的样本输出似乎不对,如果这可能是逻辑?)。

编辑:

INSERT INTO LastOccu(MaintItem, MaxDate, WONumber, ReadingNo)
SELECT wo.MaintItem, wo.RefDate, wo.Workorder, wo.ReadingNo
FROM WorkOrder wo
     INNER JOIN(
               SELECT MaintItem, MAX(RefDate) AS MaxRefDate
               FROM WorkOrder
               WHERE RefDate IS NOT NULL
               GROUP BY MaintItem
               ) AS MD ON wo.MaintItem=MD.MaintItem
                      AND wo.RefDate=MD.MaxRefDate
    where MaintItem in (Select MaintItem from MaintItem);

答案 1 :(得分:0)

一种方法是使用相关子查询:

dates[0]

INSERT INTO LastOccu ( MaintItem, MaxDate, WONumber, ReadingNo ) SELECT MD.MaintItem, MD.MaxRefDate, MD.WONumber, MD.ReadingNo FROM WorkOrder as wo INNER JOIN MaintItem as mi ON mi.MaintItem = wo.MaintItem WHERE wo.RefDate = (SELECT MAX(wo2.RefDate) FROM WorkOrder as wo2 WHERE wo2.MaintItem = wo.MaintItem ); 上的过滤并不重要,因为NULL值不会通过过滤器。