Есть много способов добиться этого -
Использование объединенного подзапроса:
Один из возможных способов - использовать inner join
в подзапросе, который выбирает максимальную дату вступления в силу.для каждого Employee SSN
:
select t1.*
from tblPreviousExport t1 inner join
(
select t2.[Employee SSN], max(t2.[Effective Date]) as md
from tblPreviousExport t2
group by t2.[Employee SSN]
) q
on t1.[Employee SSN] = q.[Employee SSN] and t1.[Effective Date] = q.md
Использование коррелированного подзапроса:
Другой метод заключается в использовании коррелированного подзапроса, который пытается выбрать запись с более поздней датой, чем текущая.record и возвращает записи, для которых такой подзапрос не возвращает результатов (представлен выражением where not exists
):
select t1.*
from tblPreviousExport t1 where not exists
(
select 1 from tblPreviousExport t2
where
t1.[Employee SSN] = t2.[Employee SSN] and
t1.[Effective Date] < t2.[Effective Date]
)
Использование LEFT JOIN
с неравными критериями соединения:
Наконец, вы также можете использовать неравные критерии объединения с left join
следующим образом, возвращая записи, для которых нет записей справа от объединения, которые удовлетворяют критериям объединения:
select t1.*
from
tblPreviousExport t1 left join tblPreviousExport t2 on
t1.[Employee SSN] = t2.[Employee SSN] and
t1.[Effective Date] < t2.[Effective Date]
where
t2.[Effective Date] is null
ThisПример может быть представлен только в MS Access в представлении SQL, так как конструктор запросов MS Access не может отображать объединения, которые имеют равные критерии объединения (т. е. когда одно поле равно другому).
Этот примерФункция ample похожа на коррелированный подзапрос, но выбор выполняется соединением, а не в предложении WHERE
.