我有两个表(在SQL Server数据库中),如下所示:
create table tblDevices(
idDevice varchar(255) not null,
(...)
primary key(idGUID));
create table tblEnvironmentLog(
ID int not null auto_increment,
idDevice varchar(30) not null,
txtLocation varchar(255),
datDate date,
datTime time,
primary key(ID));
tblEnvironmentLog
中的每个事件都属于tblDevice
中的设备,每个记录都有一个日期和位置(< - 设备的位置)。设备可能有多个记录(至少一个)。
我需要一个SQL查询,在idDevice
中查找其所有记录中最新记录的tblDevices
中的每个location
。
我已经尝试长时间编写查询,但找不到解决方案,所以欢迎任何帮助或提示。
答案 0 :(得分:0)
因此,您基本上希望获得与每个设备的最新日期/时间相对应的行。您已经指定了MySQL和SQL Server。这适用于SQL Server。
SELECT *
FROM tblDevices t1
INNER JOIN tblEnvironmentLog t2
ON t1.idDevice = t2.idDevice
WHERE t2.ID = (SELECT TOP 1 t3.ID
FROM tblEnvironmentLog t3
WHERE t2.idDevice = t3.idDevice
ORDER BY t3.datDate DESC, t3.datTime DESC)
答案 1 :(得分:0)
你需要这样的东西 -
SELECT t1.*, t2.datDate, t2.datTime
FROM tblDevices t1
JOIN tblEnvironmentLog t2 on t1.idDevice = t2.idDevice
WHERE t2.id in ( SELECT MAX(ID) FROM tblEnvironmentLog GROUP BY idDevice)
答案 2 :(得分:0)
尝试如下查询。如果您需要更好地了解如何正确添加单个组件的日期时间,see this answer
<强>说明:强>
我们使用内部查询(作为E)来查找每idDevice
的最大日期时间,然后将其加入tblDevices
(作为D)以及tblEnvironmentLog
(作为E2)以获取期望的结果。
<强>查询强>
select
DISTINCT -- this is needed as many result pair may come up with same values
D.iDDevice, E2.Location
from tblDevices D left join
(
Select
idDevice,
max( cast(datDate as datetime)+cast (datTime as dattime)) as dt
from tblEnvironmentLog
group by idDevice) E
on D.idDevice =E.idDevice
left join tblEnvironmentLog E2 on E.idDevice=E2.idDevice and
cast(E2.datDate as datetime)+cast(E2.datTime as datetime)=E.dt