【问题标题】:SQL Syntax Error - Two Column Inner JoinSQL 语法错误 - 两列内连接
【发布时间】:2014-05-26 09:47:40
【问题描述】:

我正在尝试使 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 查询是否在此查询之外工作,如果我从 INNER JOIN 中删除 AND 部分,其余的查询按预期工作。

谁能建议我的语法可能错在哪里?

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 语句应该读取 SELECT MAX(Measurement_Date) 以获取给定记录的最近日期。修改后,我仍然收到语法错误(与以前相同的错误)。为了加入这些表格,我还需要做些什么吗?

编辑2:由于到目前为止似乎没有一个答案解决了这个问题,我认为发布相关表格的结构可能会很有用:

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

目标是为给定的Metric_ID 获取最新的Measurement_Value - 因为下面的代码似乎不起作用,我愿意就如何获得它提出建议。总之,当列表按日期降序排序时,我正在寻找的值是给定 Metric_ID 的第一个 Measurement_Value

【问题讨论】:

  • 我已经添加了表格的结构,希望有人可以提供帮助。

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


【解决方案1】:

我在您的 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 )

【讨论】:

  • 不幸的是,Metric_Value_Measurement 中可能有多个记录具有相同的 Metric_ID,但日期不同 - 用例是该表记录了各种不同指标随时间变化的测量值。
  • 那是你原来的SQL的问题。您有一个可能有多个值的子查询,并且您将它与单个值进行比较。这在任何类型的 SQL 中都是错误的,但从技术上讲不是语法错误。
  • 谢谢大卫 - 不幸的是,这是我的代码中的一个错误,它应该在 SELECT 中有一个 MAX() 子句,以仅返回给定 Metric_ID 的最近日期。不幸的是,这并没有解决问题(同样的错误)。
【解决方案2】:

您是否尝试:

  1. 在 Metric 中提取每个 ID,但仅用于最近的测量?或
  2. 只提取那些具有最大测量日期的 ID?

我认为您的目标是第一个,但您的代码似乎正在实现第二个。无论如何,我认为这两种情况的关键是拉出最后一次 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");

我认为两者之一就是您要寻找的。如果没有,希望能给你更多的想法。

【讨论】:

  • 今天早上又看了一遍,我收回了我所说的关于您实现第二个场景的代码的内容。我看到您在 INNER JOIN 的 AND 部分中尝试使用 Metric.ID = Metric.ID 做什么。我不知道 Access 的数据库引擎是否喜欢 INNER JOIN 中的逐行查找。不要以为我以前做过。但是现在看,我知道你在说什么。干杯。
【解决方案3】:

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

ON (
    Metric_tab.ID = Metric_Value_Measurement.Metric_ID

能否请您在此括号周围放置一个右括号并相应地进一步更改括号的位置?

【讨论】:

  • 正如我在问题中所说,如果我从内部连接中删除 AND 部分,则查询有效 - 因此,我认为不会缺少任何括号。另外,代码中没有提到Metric_tab.ID 的部分,所以我不确定你在看哪个区域?
  • 我可以看到 Metric.ID = Metric_Value_Measurement.Metric_ID 周围缺少括号,它没有丢失,但必须关闭
  • 如果您查看声明的最底部,它已关闭。
  • 我说的是AND之前的JOIN,它必须在“AND”之前关闭
  • 在 AND 之前关闭括号没有意义 - 需要括号来包含整个“ON”子句;在 AND 之前关闭它仍然会导致语法错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多