VBA MS Access запрос - вернуть наибольшую дату из связанной таблицы - PullRequest
0 голосов
/ 12 сентября 2011

Я просмотрел тег «наибольший n на группу» и нашел отличную информацию, но ничего, что решает мою конкретную проблему.

В таблице A хранятся химические данные обо всех используемых материалах.В нем есть такие поля, как RMCode, TradeName, Hazardous, DangerousGood (все TEXT )

Таблица B содержит все паспорта безопасности материалов (которые обновляются не реже одного раза в 5 лет), и мыхранить замененные документы.Поля: RMCode ( TEXT ), linkMSDS ( HYPERLINK ) и MSDSdate ( DATE / TIME ).LinkMSDS - это гиперссылка на PDF, и мы сохраняем дату выпуска в MSDSdate.Один код RM может иметь много прикрепленных MSDS.

Две таблицы связаны через поле «Код RM».

Я хочу создать список всех материалов, которые являются DangerousGoods - но я хочубудут представлены только самые последние MSDS.Приведенный ниже код в настоящее время возвращает все MSDS.

SELECT tableB. [RMCode], tableA. [TradeName], tableA. [Hazardous], tableA. [DangerousGood], tableB. [Link MSDS]

ИЗ таблицы A ВНУТРЕННЕЕ СОЕДИНЕНИЕ tableB ON tableA. [RM Code] = tableB. [RM code]

WHERE tableA. [DangerousGood] <> «N / A» и таблица B. [MSDSdate] In

(ВЫБЕРИТЕ МАКС (таблица B. [MSDSdate])

ИЗ таблицы B

GROUP BY tableB. [RMCode])

ORDER BY tableB. [RMCode];

1 Ответ

0 голосов
/ 13 сентября 2011

Звучит так, будто вам нужна последняя MSDSdate для каждого RMCode.

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

Если это правильно, вы можете использовать его как suquery, присоединенный к TableA, и добавить в предложение 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"));

Наконец, если вам нужны значения linkMSDS для каждой из этих комбинаций RMCode / MSDSdate, вы можете присоединиться к другой копии 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"));
...