【问题标题】:SQL / Access - Joining on multiple columns?SQL / Access - 加入多个列?
【发布时间】:2014-05-26 21:37:11
【问题描述】:

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

总而言之,问题是这样的:我有 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 列上执行此连接以避免使用子报表(这在我正在运行的特定报表中将非常具有挑战性)。因此,我需要加入第二列,因为“主”表 - Desired_Future_State_Metric - 与 Metric_Value_Measurement 没有直接关系(通过 Metric 关联)。

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

【问题讨论】:

  • 这个问题可能对你有帮助:stackoverflow.com/q/23658237/78522
  • 感谢您的提醒 - 尽管这个问题似乎讨论了在单个列上加入不同方式的优点,而不是在 2 列上加入?
  • 正如@viking4821 在下面的答案中所暗示的那样,从您的文字和 SQL 中并不清楚您要达到的目标。您能否澄清一下是否需要 Metric 中的每一行,Desired_Future_State_Metric 或 Metric_Value_Measurement 或两者中相同 ID 的日期最长的行。
  • INNER JOIN ON AND ... 中的子选择是不可能的。这就是为什么我向您指出一个非常简化的子查询示例

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


【解决方案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 子句。您只能将 GROUP BY 与子查询 S 中的聚合函数一起使用。如果不是因为连接表达式的问题,您会遇到另一个语法错误。
  2. 如果您认为可以在此查询之外使用上述子查询,您可以将其保存为自己的查询,并在此查询表达式或其他查询表达式中使用它,就像任何其他 Access 查询或表一样。

【讨论】:

  • 感谢您的回答 - 这似乎快到了。我唯一不能做的就是获得实际值......我可以获得最近测量的日期(无论如何我都能通过查询生成器获得),但关键是如何获得Measurement_Value 是 metric_ID 和日期的组合吗?
  • 您只需将 Metric_Value_Measurement 内部连接到 Metric 并将测量值字段作为字段之一。
猜你喜欢
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多