SQL / Access - 连接多个列?

时间:2014-05-26 21:37:12

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

我从不同的角度提出这个问题,但根据这个问题的答案,我相信我现在更接近实现我所需要的。

总之,问题是:我有3个表,MetricDesired_Future_State_MetricMetric_Value_Measurement。正如您可能从名称中推断的那样,Metric_Value_Measurement是一系列不同指标的日期约束(对于任何给定的指标,都会有多个度量)。

我要做的是在Desired_Future_State_Metric条记录表中显示最新的衡量标准。简而言之,这要求我在按日期排序列表时为任何给定的Metric选择第一条记录。遗憾的是,Access查询构建器不允许我这样做,因为我无法对单个记录执行SELECT并按其他列排序。

在此基础上,我认为我需要直接编写SQL,我的尝试在下面 - 不幸的是,这会导致错误 - Syntax error in query expression 'Metric.ID = Metric_Value_Measurement.Metric_ID AND (SELECT Measurement_Date FROM Metric_Value_Measurement WHERE Metric_ID = '1') = Metric_Value_Measurement.Measurement_Dat'. - 我认为这是因为我试图加入具有多个记录的单个记录(来自SELECT MAX嵌套查询)。

我已在下面发布了我的代码,但我可以接受其他建议 - 如何将表格加入每个Desired_Future_State_Metric

我的SQL:

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
,Metric_Value_Measurement.Measurement_Date
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.Metric_ID
)
INNER JOIN Metric_Value_Measurement ON (
    Metric.ID = Metric_Value_Measurement.Metric_ID
    AND (
        SELECT MAX(Measurement_Date)
        FROM Metric_Value_Measurement
        WHERE Metric_ID = Metric.ID
        ) = Metric_Value_Measurement.Measurement_Date
    )
GROUP 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
,Metric_Value_Measurement.Measurement_Date;

我桌子的结构:

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

编辑:可能值得一提的是,我尝试在2列上进行此连接以避免使用子报告(这在特定报告中非常具有挑战性,我正在运行)。因此,我需要加入第二列,因为' master'表格Desired_Future_State_Metric - 与Metric_Value_Measurement没有直接关系(通过Metric相关)。

编辑2:根据Viking的评论澄清 - 我正在尝试为每个Desired_Future_State_Metric获取最新的Measurement_Value。在这种情况下,最近的定义是测量日期,而不是最高ID

1 个答案:

答案 0 :(得分:1)

编辑 - 添加Metric_Value_Measurement以连接表达式以在查询结果中获取Measurement_Value。

对我来说,您希望将特定Metric_ID的最新测量值连接回Desired_Future_State_Metric表(如果不是这样,后面的内容可能会有所帮助,也可能没有帮助。)

执行此操作的一种方法是在查询的连接表达式中使用子查询,该子查询选择与最近的Measurement_Date关联的Metric_ID。该子查询看起来像这样:

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

您在连接表达式中使用子查询的查询将如下所示:

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
,Metric_Value_Measurement.Measurement_Value
,Metric_Value_Measurement.Measurement_Date
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.Metric_ID)
INNER JOIN Metric_Value_Measurement ON Metric.ID = Metric_Value_Measurement.Metric_ID)
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
,Metric_Value_Measurement.Measurement_Date;

一些注意事项:

  1. 我将主查询表达式中的GROUP BY子句更改为ORDER BY子句。您只能在子查询S中使用GROUP BY和聚合函数。如果不是连接表达式的问题,则会遇到另一个语法错误。
  2. 如果您认为可以在此查询之外使用上面的子查询,则可以将其保存为自己的查询,并在此查询表达式或其他查询表达式中使用它,就像任何其他Access查询或表一样。