Один метод использует агрегирование в подзапросе:
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';
Это ведет себя так, как вы, вероятно, и предполагаете, потому что действует больше как внешнее соединение.