T sql возвращает ошибку в подзапросе при использовании Min и Max - PullRequest
0 голосов
/ 11 февраля 2020

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

Использование следующего запроса для получения любого человека, который вошел в систему поздно или ушел рано

SELECT Email,
       StartTime,
       EndTime
FROM tierreport
     LEFT JOIN (SELECT MIN(TimeIn) AS TimeIn,
                       MAX(TimeOut) AS TimeOut
                FROM InOutUserCurrentStatus) IO ON (IO.Email = Email)
WHERE tierreport.Email = 'fred.bloks@xyz.com'
  AND IO.Date >= '2019-11-01'
  AND IO.Date <= '2019-11-29'
  AND (IO.TimeIn > StartTime
    OR IO.TimeOut < EndTime);

Однако постоянно появляется сообщение об ошибке «ошибка 207 недействительное имя столбца Электронная почта, недействительное имя столбца Дата» я что-то упустил

1 Ответ

0 голосов
/ 11 февраля 2020

Один метод использует агрегирование в подзапросе:

SELECT tr.Email, tr.StartTime, tr.EndTime
FROM tierreport tr LEFT JOIN
     (SELECT IO.Email,
             MIN(TimeIn) AS TimeIn, MAX(TimeOut) AS TimeOut
      FROM InOutUserCurrentStatus
      GROUP BY IO.Email
     ) IO
     ON IO.Email = tr.Email
WHERE tr.Email = 'fred.bloks@xyz.com' AND
      IO.Date >= '2019-11-01' AND
      IO.Date <= '2019-11-29' AND
      (IO.TimeIn > StartTime OR IO.TimeOut < EndTime);

Примечание. Вы используете LEFT JOIN, но предложение WHERE преобразует это в INNER JOIN.

В качестве альтернативы вы можете использовать OUTER APPLY:

SELECT Email, StartTime, EndTime
FROM tierreport tr OUTER APPLY JOIN
     (SELECT MIN(TimeIn) AS TimeIn, MAX(TimeOut) AS TimeOut
      FROM InOutUserCurrentStatus
      WHERE IO.Email = tr.Email AND
            IO.Date >= '2019-11-01' AND
            IO.Date <= '2019-11-29' AND
            (IO.TimeIn > tr.StartTime OR IO.TimeOut < tr.EndTime)
     ) IO         
WHERE tr.Email = 'fred.bloks@xyz.com';

Это ведет себя так, как вы, вероятно, и предполагаете, потому что действует больше как внешнее соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...