VBA MS Access查询 - 从链接表返回最大日期

时间:2011-09-12 03:39:11

标签: ms-access vba ms-access-2007 access-vba greatest-n-per-group

我查看了最好的每组标签,发现了很多信息,但没有解决我的具体问题。

表A列出了所有使用材料的化学数据。 它有RMCode,TradeName,Hazardous,DangerousGood等字段(全部 TEXT

表B包含所有材料安全数据表(至少每5年更新一次),我们存储已取代的文件。 这些字段是RMCode( TEXT ),linkMSDS( HYPERLINK )和MSDSdate( DATE / TIME )。 LinkMSDS是pdf的超链接,我们在MSDSdate中存储发布日期。一个RM代码可以有许多附加的MSDS。

这两个表通过“RM Code”字段链接。

我想生成所有DangerousGoods材料的清单 - 但我只想要展示最新的MSDS。 以下代码目前正在返回所有MSDS。

  

SELECT tableB。[RMCode],tableA。[TradeName],tableA。[危险],tableA。[DangerousGood],tableB。[link MSDS]

     

FROM tableA INNER JOIN tableB ON tableA。[RM Code] = tableB。[RM code]

     

WHERE tableA。[DangerousGood]<> “N / A”和tableB。[MSDSdate]在

     
    
      

(SELECT MAX(tableB。[MSDSdate])

             

FROM tableB

             

GROUP BY tableB。[RMCode])

    
  
     

ORDER BY tableB。[RMCode];

1 个答案:

答案 0 :(得分:0)

听起来像你需要每个RMCode的最新MSDSdate。

SELECT RMCode, Max(MSDSdate) AS MaxOfMSDSdate
FROM TableB
GROUP BY RMCode;

如果这是正确的,您可以将它用作连接到TableA的suquery,并添加WHERE子句以使用DangerousGood =“N / A”排除行。

SELECT a.RMCode, a.DangerousGood, b.MaxOfMSDSdate
FROM
    TableA AS a
    INNER JOIN [
        SELECT RMCode, Max(MSDSdate) AS MaxOfMSDSdate
        FROM TableB
        GROUP BY RMCode
        ]. AS b
       ON a.RMCode = b.RMCode
WHERE (((a.DangerousGood)<>"N/A"));

最后,如果您需要每个RMCode / MSDSdate组合的linkMSDS值,您可以加入另一个TableB副本。

SELECT a.RMCode, a.DangerousGood, b.MaxOfMSDSdate, b2.linkMSDS
FROM
    (TableA AS a
    INNER JOIN [
        SELECT RMCode, Max(MSDSdate) AS MaxOfMSDSdate
        FROM TableB
        GROUP BY RMCode
        ]. AS b
        ON a.RMCode = b.RMCode)
    INNER JOIN TableB AS b2
        ON (b.RMCode = b2.RMCode) AND (b.MaxOfMSDSdate = b2.MSDSdate)
WHERE (((a.DangerousGood)<>"N/A"));