Соединение SQL ограничено 1 строкой, где время является самым старым для даты - PullRequest
0 голосов
/ 04 июня 2019

У меня есть 2 таблицы, к которым я присоединяюсь;Я хочу, чтобы все строки из таблицы сотрудников извлекали последнее время для даты в таблице транзакций;таблица транзакций может иметь несколько записей для сотрудника на одну и ту же дату.В настоящее время не удается найти способ ограничить транзакции последней записью (последняя запись времени)

Это таблица доступа;Запрос Adodb из Excel для доступа.

SELECT E.ID, E.Employee, E.lastname, T.in, T.out, T.date, T.type, T.EmployeeID FROM employee E RIGHT JOIN transactions T ON E.ID = INT(T.EmployeeID) WHERE " & _
    "T.date = #" & Format(yesterdate, "Short Date") & "# AND T.type = 'JobCode5' AND E.location = 'EastBuilding' AND E.ID = 89 AND E.stat = TRUE

Я ожидаю получить 1 транзакцию на соответствующего сотрудника;желательно сделка с самым поздним временем на данную дату.

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Подзапрос выполняет свою работу, но работает довольно медленно

SELECT E.employee, E.lastname, (SELECT TOP 1 IIF(ISNULL([in]), '', [in]) FROM [transactions] WHERE [date] = #6/3/2019# AND [type] = 'JobCode5' AND INT([EmployeeID]) = E.ID ORDER BY transactions.ID DESC) AS IN_TIME, " & _
        "(SELECT TOP 1 IIF(ISNULL([out]), '', [out]) FROM [transactions] WHERE [date] = #6/3/2019# AND [type] = 'JobCode5' AND INT([EmployeeID]) = E.ID ORDER BY transactions.ID DESC) AS AS_TIME FROM employee E WHERE E.stat = True AND E.location = 'EastBuilding'
0 голосов
/ 04 июня 2019

Вы можете использовать коррелированный подзапрос для получения последней транзакции. В MS Access есть хитрость для работы с сотрудниками без транзакций:

SELECT E.ID, E.Employee, E.lastname,
       T.in, T.out, T.date, T.type, T.EmployeeID 
FROM employee as E LEFT JOIN
     transactions as T
     ON E.ID = INT(T.EmployeeID) 
WHERE (T.out = (SELECT MAX(t2.out)
                FROM transactions as T2
                WHERE T2.EmployeeID = T.EmployeeID AND
                      T2.Date = T.Date AND
                      T.type = 'JobCode5'
               ) OR
       T.date IS NULL
      ) AND
      <your filters here>
...