Выберите последнюю запись в отношении один-ко-многим - PullRequest
0 голосов
/ 23 января 2019

Я использую ms-access и у меня есть 2 таблицы tblAssets и tblauditlog. Я пытаюсь получить последний журнал аудита всех активов, у которых состояние активов = 6, что означает, что они были проданы. Отношения между этими двумя таблицами: tblassets.assetid = tblauditlog.logaspectid. Я только получил все журналы аудита для активов, которые были проданы, но я ищу последнюю запись. У меня есть поле даты, но когда я использую Max (tblauditlog.logtimestamp), он выдает ошибку

Я пытался использовать

SELECT <br>
r.assetid, <br>
r.assetcategory, <br>
r.assetstatus, <br>
sub2.logmessage, <br>
sub2.logtimestamp <br>
FROM <br>
     tblAssets as r <br>
LEFT JOIN <br> <br>
 (SELECT <br>
     sub1.logaspectid, <br>
     a2.logMessage, <br>
     a2.logtimestamp <br>
 FROM  <br>
       ( <br>
        SELECT <br>
         a1.logaspectid, <br>
         Max(a1,logtimestamp) AS MaxOfTimeStamp <br>
         FROM tblauditlog AS a1  <br>
         GROUP BY a1.logaspectid ) AS sub1  <br>
       INNER JOIN tblauditlog as a2  <br>
 ON  <br>
     (sub1.MaxOfTimeStamp = a2.logTimestamp) AND (sub1.logaspectid = a2.logaspectid)) AS sub2 <br>
ON r.assetid = sub2.logaspectid ;

Выше выдает ошибку:

Невозможно выполнить запрос. Неверная операция или синтаксис с использованием нескольких значений поле

Это то, что я возвращаю несколько записей

SELECT tblAssets.assetID, tblAssets.assetCategory, tblAssets.assetModel,
       tblAssets.assetStatus, tblAuditLog.logAspectID, tblAuditLog.logMessage,
       tblAuditLog.logTimeStamp
FROM tblAssets
    LEFT JOIN tblAuditLog ON tblAssets.assetID = tblAuditLog.logAspectID
WHERE (((tblAssets.assetStatus)=6)
   AND ((tblAuditLog.logTimeStamp)>=#1/1/2017#));  


Я просто хочу, чтобы последний зарегистрированный журнал для всего актива = 6 был продан.

1 Ответ

0 голосов
/ 23 января 2019

Если я правильно понимаю, вы можете использовать коррелированный подзапрос для получения последней записи журнала аудита. Затем вы можете проверить, имеет ли это статус, который вы хотите:

SELECT . . .
FROM tblAssets as a INNER JOIN
     tblauditlog as al
     ON a.assetid = al.logaspectid
WHERE al.logtimestamp = (SELECT MAX(al2.logtimestamp)
                         FROM tblauditlog as al2
                         WHERE al2.logaspectid = al.logaspectid
                        ) AND
      al.assetstatus = 6 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...