【发布时间】: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