У меня есть две таблицы, одна для некоторых устройств и другая для их местоположения (используя эту таблицу для отслеживания истории местоположений). Схемы таблиц:
tbl_Devices:
- DeviceSrNumber (bigint, not null, pk)
- Некоторые другие столбцы
tbl_DeviceLocation
- SrNumber (bigint, not null, pk, identity)
- DeviceSrNumber (bigint, not null)
- Местоположение (varchar (300), не ноль)
- AddDateTime (DateTime, не нуль)
Мне нужно DeviceSrNumber
, последнее Location
, последнее заданное местоположение AddDateTime
Что я сейчас делаю:
SELECT
DeviceSrNumber,
(
SELECT TOP (1) Location
FROM tbl_DeviceLocation
WHERE (DeviceSrNumber = d.DeviceSrNumber)
ORDER BY AddDateTime DESC
) AS 'Location',
(
SELECT TOP (1) AddDateTime
FROM tbl_DeviceLocation
WHERE (DeviceSrNumber = d.DeviceSrNumber)
ORDER BY AddDateTime DESC
) AS 'AddDateTime '
FROM
tbl_Devices AS d
Но мне нужно сделать это с более чистым соединением, потому что, насколько мне известно, подзапрос не эффективен и не рекомендуется в крупномасштабной базе данных.
Примечание. Это небольшая часть большого проекта, в котором рассматриваются миллионы записей.