我试图让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
。
答案 0 :(得分:2)
我无法在您的SQL中看到语法错误,但如果Metric_Value_Measurement
中有多个行具有相同的Metric_ID
但Measurement_Date
值不同,则可能会出现问题
但是,对于您正在进行的操作,您的SQL太复杂了。假设您Metric_Value_Measurement
中的多行没有相同的Metric_ID
但Measurement_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)
我认为你的目标是第一个,但你的代码似乎正在实现第二个。在任何情况下,我认为任何一种情况的关键是拉动你最后一次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
你能否在这个括号附近放一个右括号并进一步改变括号的位置?