我有三张桌子:
包含已在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
非常感谢帮助!
答案 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
值不会通过过滤器。