SQL语法错误 - 两列内连接

时间:2014-05-26 09:47:41

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

我试图让SQL查询正常工作(在Access 2007中),但我反复收到有关语法错误的一般错误消息,它只是说明(没有拼写错误 - 它似乎截断了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'.

我试图使用的SQL如下所示 - 我已经检查过嵌套的SELECT查询是否在此查询之外工作,如果我从{{1}删除AND部分查询的其余部分按预期工作。

有人可以建议我的语法可能出错吗?

INNER JOIN

编辑:感谢下面的David Wallace,问题似乎是我将单个值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_Value_Measurement.Measurement_Date语句应该读取SELECT以获取给定记录的最新日期。修改了这个,我仍然得到一个语法错误(与以前相同的错误)。为了加入这些表,我还需要做些什么吗?

编辑2:由于迄今为止似乎没有解决问题的答案,我认为发布相关表格的结构可能有用:

SELECT MAX(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 获取最新的Measurement_Value - 因为下面的代码似乎不起作用,我对以下方面的建议表示欢迎会得到这个。总而言之,当列表按日期降序排序时,我查找的值是给定Metric_ID的第一个Measurement_Value

3 个答案:

答案 0 :(得分:2)

我无法在您的SQL中看到语法错误,但如果Metric_Value_Measurement中有多个行具有相同的Metric_IDMeasurement_Date值不同,则可能会出现问题

但是,对于您正在进行的操作,您的SQL太复杂了。假设您Metric_Value_Measurement中的多行没有相同的Metric_IDMeasurement_Date值不同,那么您的SQL实际上与此相当。

SELECT DISTINCT
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 
JOIN Desired_Future_State_Metric ON Metric.ID = Desired_Future_State_Metric.Metric_ID
JOIN Metric_Unitvalue ON Metric.ID = Metric_Unitvalue.Metric_ID
JOIN Metric_Value_Measurement ON Metric.ID = Metric_Value_Measurement.Metric_ID

修改

好了,既然您已经在其中添加了MAX(),那么您在联接中的条款应该是WHERE条款的一部分,而不是一个JOIN。因此,在所有JOIN子句之后添加此附加部分。

WHERE Metric_Value_Measurement.Measurement_Date = (
    SELECT MAX(Measurement_Date)
    FROM Metric_Value_Measurement
    WHERE Metric_ID = Metric.ID )

答案 1 :(得分:0)

你打算尝试:

  1. 在公制中提取每个ID,但仅用于最长的测量? OR
  2. 仅提取具有最大测量日期的ID?
  3. 我认为你的目标是第一个,但你的代码似乎正在实现第二个。在任何情况下,我认为任何一种情况的关键是拉动你最后一次INNER JOIN的AND部分。

    在第一种情况下,您可以将其保存为单独的查询,例如qryMeasurement_Date_Maxs:

    SELECT Metric_ID, MAX(Measurement_Date) AS Measurement_Date_Max
    FROM Metric_Value_Measurement
    

    并将您的主要查询更改为:

    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
        )
    INNER JOIN qryMeasurement_Date_Maxs ON (
        Metric_Value_Measurement.Metric_ID = qryMeasurement_Date_Maxs.Metric_ID
        AND Metric_Value_Measurement.Measurement_Date = qryMeasurement_Date_Maxs.Measurement_Date_Max
    )
    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;
    

    在第二种情况下,我认为您可以在HAVING谓词中移动最大日期:

    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
        )
    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
    HAVING Metric_Value_Measurement.Measurement_Date = DMax("Measurement_Date", "Metric_Value_Measurement");
    

    我认为其中一个是您正在寻找的。如果没有,希望可以给你更多的想法。

答案 2 :(得分:-2)

访问要求在每个使用的连接周围都有括号,但我可以看到缺少的连接

ON (
    Metric_tab.ID = Metric_Value_Measurement.Metric_ID

你能否在这个括号附近放一个右括号并进一步改变括号的位置?