使用 LEFT JOIN 获得完全匹配相对容易
SELECT t1.Unit, t2.Metric
FROM Table1 t1
LEFT JOIN Table2 t2 ON t2.Unit = t1.Unit AND t2.Date = t1.Date
如果没有完全匹配,则使用此查询 t2.Metric 将为 NULL。要获得没有完全匹配的指标是比较棘手的。在 MS SQL Server 中,您可以编写用户定义函数 (UDF) 以返回最接近的值。
create function dbo.udfGetMetric(@Unit char(1), @Date datetime) returns int
as
BEGIN
declare @Metric smallint;
SELECT TOP(1) @Metric = Metric
FROM Table2
WHERE Unit = @Unit
and [Date] < @Date
ORDER BY [Date] DESC;
RETURN @Metric;
END
GO
然后,当值为 NULL 时,您可以在查询中调用此函数
SELECT t1.Unit, ISNULL(t2.Metric, dbo.udfGetMetric(t1.Unit, t1.[Date])) as Metric
FROM Table1 t1
LEFT JOIN Table2 t2 ON t2.Unit = t1.Unit AND t2.[Date] = t1.[Date];
您可以通过使用子查询而不是函数来做同样的事情:
SELECT t1.Unit
, ISNULL(t2.Metric, (SELECT TOP(1) Metric
FROM Table2
WHERE Unit = t1.Unit
and [Date] < t1.[Date]
ORDER BY [Date] DESC)) as Metric
FROM Table1 t1
LEFT JOIN Table2 t2 ON t2.Unit = t1.Unit AND t2.[Date] = t1.[Date];