SQL / Access - 自我加入需要获取最新值?

时间:2014-05-27 09:38:25

标签: sql ms-access ms-access-2007

我有一个SQL查询,它基于以下表格:

Metric
----------
ID
Description

Desired_Future_State_Metric
----------
ID
Metric_ID
Desired_Future_State_ID
Target_Value
Target_Date

Metric_Value_Measurement
----------
ID
Metric_ID
Measurement_Date
Measurement_Value

目标是从Measurement_Value找到每个Metric_ID的最新Metric_Value_Measurement,以便在Desired_Future_State_Metric的表格中显示。 (对于每个Value_Measurement,最近的测量应定义为最新日期的Metric_ID

以下SQL(从另一个问题的答案生成)是起点,因为它允许我获取所有必需的数据,包括最近的日期;我唯一能做的就是加入实际的Measurement_Value

SELECT Desired_Future_State_Metric.Desired_Future_State_ID
,Desired_Future_State_Metric.Metric_ID
,Desired_Future_State_Metric.Target_Value
,Desired_Future_State_Metric.Target_Date
,Metric.Description
,Metric.Unit
,S.MaxDate 
FROM ((Metric
INNER JOIN Desired_Future_State_Metric 
ON Metric.ID = Desired_Future_State_Metric.Metric_ID)
INNER JOIN Metric_Unitvalue ON Metric.ID = Metric_Unitvalue.MetricID)
INNER JOIN (SELECT Metric_ID, Max(Measurement_Date) As MaxDate FROM
Metric_Value_Measurement GROUP BY Metric_ID) As S
ON Metric.ID = S.Metric_ID
ORDER BY Desired_Future_State_Metric.Desired_Future_State_ID
,Desired_Future_State_Metric.Metric_ID
,Desired_Future_State_Metric.Target_Value
,Desired_Future_State_Metric.Target_Date
,Metric.Description
,Metric.Unit
,S.MaxDate;

为了尝试将最新测量的ID放入表中,我尝试将子查询更改为:

(SELECT Metric_ID, Max(Measurement_Date) As MaxDate, MAX(ID) FROM
Metric_Value_Measurement GROUP BY Metric_ID)

我的想法是,这会给我MaxDate的最高ID(我可以用它来获取Measurement_Value)但不幸的是,这两列是独立获得最大值的;因此,ID只是Metric_ID的ID列的MAX,而不是Metric_ID和日期的最大值。

所以,我似乎需要在该表上进行自联接以获得测量值,但每次我尝试这样做时,我都会得到错误(即使我在我的加入中使用了括号):

JOIN expression not supported

自我加入正确的方式来解决这个问题吗?有没有其他方法可以获得Measurement_Value

1 个答案:

答案 0 :(得分:1)

这为您提供了最新的测量日期。

select metric_id, max(measurement_date) max_measurement_date
from metric_value_measurement
group by metric_id;

将其加入metric_value_measurement以获取最近测量日期的整行。

select t1.metric_id, t1.measurement_date, t1.measurement_value
from metric_value_measurement t1
inner join (select metric_id, max(measurement_date) maxdate
            from metric_value_measurement
            group by metric_id
           ) t2
        on t1.metric_id = t2.metric_id 
       and t1.measurement_date = t2.maxdate;

这本身就是一个有用的查询。如果我是你,我将从这个SELECT语句创建一个视图,并在查询中使用该视图。 Microsoft Access的优化程序在优化连接中使用的视图方面做得很好。我们假设您将该视图命名为Most_Recent_Metric_Value_Measurement。

然后我你可以改变这个内连接。 。

INNER JOIN (SELECT Metric_ID, Max(Measurement_Date) As MaxDate FROM
Metric_Value_Measurement GROUP BY Metric_ID) As S
ON Metric.ID = S.Metric_ID

。 。 。对此。 。

INNER JOIN Most_Recent_Metric_Value_Measurement S
        ON Metric.ID = S.Metric_ID

剩下的一点是你正在使用列别名" maxdate"在外部查询中。在我写这篇文章时,上面的查询使用了原始列名," measurement_date",而不是" maxdate"。 (我认为" measurement_date"当你观察视图时更有意义。)所以你需要改变" maxdate"到外部查询中的measurement_date,或更改视图以使用列别名" maxdate"。