【问题标题】:Error #4104 : The multi-part identifier could not be bound错误 #4104:无法绑定多部分标识符
【发布时间】:2018-06-07 23:37:12
【问题描述】:

类似于this question 我有这个错误我无法修复。

情况如下:

我们在 Access 2003 下有一个应用程序前端,其中包含来自 SQL Server 2008 R2 的链接表。

我们有一个表 Vehicule(immat, secteur) 和一个表 Vehicule_suivi_km(immat, date, km)。我们的车辆存储在[Vehicule]表中,主键为[immat],其公里记录存储在[Vehicule_suivi_km]表中,主键为[immat]+[date]。

现在我必须创建年度活动的摘要。我做了如下:

查询创建 [MO km max 2016]:

SELECT Vehicule.immat, vsk2016.date, vsk2016.km
FROM Vehicule INNER JOIN Vehicule_suivi_km AS vsk2016 ON Vehicule.immat=vsk2016.immat
WHERE (((vsk2016.date)=(SELECT Max(date) FROM Vehicule_suivi_km WHERE (Vehicule_suivi_km.date<#01/01/17# And Vehicule_suivi_km.immat=vsk2016.immat))))
ORDER BY Vehicule.immat;

此代码为我提供了在 #01/01/2017# 之前的最近公里记录的车辆路线。

我在 2017 年再次这样做 [MO km max 2017]:

SELECT Vehicule.immat, vsk2017.date, vsk2017.km
FROM Vehicule INNER JOIN Vehicule_suivi_km AS vsk2017 ON Vehicule.immat=vsk2017.immat
WHERE (((vsk2017.date)=(SELECT Max(date) FROM Vehicule_suivi_km WHERE (Vehicule_suivi_km.date<#01/01/18# And Vehicule_suivi_km.immat=vsk2017.immat))))
ORDER BY Vehicule.immat;

现在我想创建一个查询,将这两个表连接起来,并从 2017 年的公里数中减去 2016 年的公里数 [MO km this year]:

SELECT [MO km max 2017].immat, [MO km max 2017].km-Nz([MO km max 2016].km,0) AS km
FROM [MO km max 2017] LEFT JOIN [MO km max 2016] ON [MO km max 2017].immat = [MO km max 2016].immat;

如果我们在 2017 年 1 月 1 日之后购买了车辆,我会使用左连接。所以我使用 Nz 来转换 0 中的空值(在 SQL Server 中它可能通过 COALESCE 函数,但我使用 Access 进行查询)

执行此查询时出现以下错误(无法绑定多部分标识符 [#4104]):

如果我使用 INNER JOIN 而不是 LEFT JOIN,我不会再收到此错误,但我只会获得 2017 年 1 月 1 日之前购买的车辆的记录。

是主键问题吗?我不明白我做错了什么。

编辑 1

错误信息是说

[Microsoft][ODBC Driver 11 for SQL Server][SQL Server] 无法绑定多部分标识符“vsk2016.immat”。 37000 4104 [Microsoft][ODBC Driver 11 for SQL Server][SQL Server] 无法绑定多部分标识符“vsk2016.date”。 (#4104)

编辑 2

通过在 [MO km max 2016] 和 [MO km max 2017] 中添加 GROUP BY close 解决了我的问题:

SELECT Vehicule.immat, vsk2017.[date], vsk2017.km
FROM Vehicule INNER JOIN Vehicule_suivi_km AS vsk2017 ON Vehicule.immat=vsk2017.immat
WHERE (((vsk2017.[date])=(SELECT Max([date]) FROM Vehicule_suivi_km WHERE (Vehicule_suivi_km.[date]<#01/01/18# And Vehicule_suivi_km.immat=vsk2017.immat))))
GROUP BY Vehicule.immat, vsk2017.[date], vsk2017.km
ORDER BY Vehicule.immat;

但我仍然想知道为什么会收到此错误消息。引擎是否不确定“immat”在我的查询结果中是唯一的,所以我必须添加 GROUP BY 关闭?

【问题讨论】:

  • 错误快照中显示的错误看起来不像英文。你能把整个错误信息翻译成英文吗?您确定使用 INNER JOIN 只更改 JOIN 而不更改其他内容吗?
  • 当然,错误消息是“[Microsoft][ODBC Driver 11 for SQL Server][SQL Server] 无法绑定多部分标识符“vsk2016.immat”。37000 4104 [Microsoft ][ODBC Driver 11 for SQL Server][SQL Server] 无法绑定多部分标识符“vsk2016.date”。(#4104)“看起来像 [immat] 和 [date] 两列(它们是vsk2016的主键,[Vehicule_suivi_km]的别名)错误。是的,我刚刚将 LEFT 替换为 INNER 用于 JOIN。
  • 有趣!!如果它适用于 INNER JOIN,那么它也应该适用于其他 JOIN。日期和 immat 字段存在于表 Vehicule_suivi_km 中?由于日期是保留关键字,请谨慎使用并用 [ ] 括起来。
  • 是的,表格中存在字段。我包围了 vsk2016.[date] 但它没有任何改变。但 !我在两个表 [MO km max 2016] 和 [MO km max 2017] 中添加了一个 GROUP BY close,现在它运行良好。我添加了有关主要问题的详细信息,但我仍然想知道为什么我会收到此错误消息!

标签: sql-server join sql-server-2008-r2


【解决方案1】:

我遇到了同样的问题,即将查询与左连接链接,但我发现如果我将每个查询都设置为链接到唯一值,那就没问题了。

【讨论】:

    猜你喜欢
    • 2021-11-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多