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

Sql 搜索最大日期并返回最大日期项以及该记录的其他字段,sql,ms-access,Sql,Ms Access,我有三张桌子: 包含已在MaintItems上完成的所有工单的WorkOrder(MaintItem将在WorkOrder表中出现多次) 包含唯一MaintItems列表的MaintItems LastOccu用于存储MaintItem的WorkOrder表中的上次事件详细信息 确定上次执行MaintItem的日期,并使用MaxDate和MaintItem正确填写LastOccu表。我遇到的问题是,当我想用附加的WorkOrder Number字段更新lastOccu表时,查询会返回该

我有三张桌子:

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

  • 包含唯一MaintItems列表的MaintItems

  • LastOccu用于存储MaintItem的WorkOrder表中的上次事件详细信息

确定上次执行MaintItem的日期,并使用MaxDate和MaintItem正确填写LastOccu表。我遇到的问题是,当我想用附加的WorkOrder Number字段更新lastOccu表时,查询会返回该MaintItem的所有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


非常感谢您的帮助

我认为没有必要加入MaintItem表。每个工单都应该有一个对应的MaintItem条目,不是吗?如果没有,那就加入吧(我不明白那是工单还是工号)

注意:哎呀,我错过了您将标签从sql server更改为MSAccess的机会。这不支持ANSI SQL,但至少应该支持这种简单的SQL,所以不需要删除。(您的示例输出似乎不正确,如果这是逻辑的话?)

编辑:


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

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
上的筛选并不重要,因为
NULL
值将不会通过筛选。

我已将标记更改为表示ms access而不是SQL Server,如果此中有SQL Server元素,请重新添加它,并提供有关特定部分是SQL Server的一些详细信息。您好,感谢您的回复。在MaintItem表上进行联接的原因是WorkOrder表将引用已删除的MaintItem。因此,我只希望WorkOrder表中的MaintItem在MaintItem表中具有相应的MaintItem……从完整性角度来看,这似乎不正确。但是,您可以使用联接或EXISTS(或IN-query)添加它。我将添加和编辑版本。
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);
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
                       );