交叉申请包括无效

时间:2014-07-07 14:57:33

标签: sql sql-server

我有两个表,Sensors和SensorCalibrations。在第一个我拿着一个物理传感器列表。他们需要校准,所以在第二个表中我保存了关于校准的日期(和其他信息)。

因此,对于Sensor表中的每一行,我可能在SensorCalibrations中有许多行,表示每次校准传感器。

CREATE TABLE Sensors(
    SensorGUID uniqueidentifier NOT NULL,
    SerialNumber nvarchar(25) NOT NULL,
    ModelName nvarchar(25) NOT NULL,
    SensorAvailable bit NOT NULL,
    SensorType nvarchar(100) NOT NULL,
    DisplayUnits nvarchar(20) NULL,
    LastEdit datetime NOT NULL)

CREATE TABLE SensorCalibrations(
    SensorCalibrationGUID uniqueidentifier NOT NULL,
    SensorGUID uniqueidentifier NOT NULL,
    CalibrationDate datetime NOT NULL,
    Offset float NOT NULL,
    Sensitivity float NOT NULL)

我需要一个查询,它将返回每个传感器行以及该传感器的最新SensorCalibartion,通过每个表中的SensorGUID列进行链接。以下是我到目前为止使用的SQL Server 2012:

SELECT s.SerialNumber, c.CalibrationDate
FROM Sensors s
CROSS APPLY (
    SELECT TOP 1 *
    FROM SensorCalibrations c
    WHERE c.SensorGUID = s.SensorGUID
    ORDER BY c.CalibrationDate DESC
) c
ORDER BY c.CalibrationDate DESC

这几乎可以工作但不会显示未校准的传感器。或者,也就是说,没有显示传感器表中的记录,这些记录在SensorCalibrations表中没有至少一个匹配记录。我需要的是每个传感器记录都要返回其匹配的最近校准日期,或者如果它没有经过校准,则只返回NULL。

有人可以建议我如何更改查询以实现此目标吗?

TIA

1 个答案:

答案 0 :(得分:6)

SELECT s.SerialNumber, c.CalibrationDate
FROM Sensors s
OUTER APPLY (
    SELECT TOP 1 *
    FROM SensorCalibrations c
    WHERE c.SensorGUID = s.SensorGUID
    ORDER BY c.CalibrationDate DESC
) c
ORDER BY c.CalibrationDate DESC