带有内部联接和子查询的 Microsoft Access 更新语句
Posted
技术标签:
【中文标题】带有内部联接和子查询的 Microsoft Access 更新语句【英文标题】:Microsoft Access Update Statement with Inner Joins and Subqueries 【发布时间】:2013-10-16 20:17:07 【问题描述】:我很难弄清楚如何执行此更新查询。基本上我需要更新一个名为 tblOpenJobs 的表。它需要使用具有 Max Install 日期的 dbo_WorkOrders 表进行更新。但是这两个表之间没有直接关系,您需要在它们之间有 dbo_premise 表。这是我的查询,我做错了什么?
UPDATE tblOpenJobs
INNER JOIN (dbo_Premise INNER JOIN dbo_WorkOrders w (WHERE w.InstallDate IN
(SELECT MAX(InstallDate) FROM dbo_WorkOrders WHERE dbo_WorkOrders.PremiseKey = w.PremiseKey))
ON (dbo_Premise.PremiseKey = w.PremiseKey)
ON tblOpenJobs.ServiceOrderNum = dbo_Premise.AccountNumber
SET tblOpenJobs.InstallerID = w.InstallerID,
tblOpenJobs.InstallDate= w.InstallDate,
tblOpenJobs.New_Serial_num= w.NewSerial,
tblOpenJobs.Old_Reading= w.OldRead;
【问题讨论】:
将你的 SQL 粘贴到 Vim 中表明你在 "INNER JOIN (dbo_Premise
" 处有一个左括号,而右括号 )
是不匹配的。但是,当您运行该查询时,Access 会告诉您什么?有错误信息吗? Access 是否抱怨 “操作必须使用可更新的查询” 还是其他错误?
【参考方案1】:
我在 Access 2007 查询窗口中检查了这一点: 您的查询似乎既不是 Transact-SQL,也不是 Access,因为两者的语法不同。
在 Access 中,表别名必须使用关键字 AS,而 Transact-SQL 不需要:
UPDATE ((tblOpenJobs
INNER JOIN dbo_Premise
ON tblOpenJobs.ServiceOrderNum = dbo_Premise.AccountNumber)
INNER JOIN dbo_WorkOrders AS w
ON dbo_Premise.PremiseKey = w.PremiseKey)
SET tblOpenJobs.InstallerID = w.InstallerID,
tblOpenJobs.InstallDate = w.InstallDate,
tblOpenJobs.New_Serial_num = w.NewSerial,
tblOpenJobs.Old_Reading = w.OldRead
WHERE (w.InstallDate IN
(SELECT MAX(InstallDate)
FROM dbo_WorkOrders
WHERE dbo_WorkOrders.PremiseKey = w.PremiseKey))
这在语法上是正确的,但我不确定它是否可以更新您的数据,因为在 Access 中多表链接更新并不容易。
【讨论】:
以上是关于带有内部联接和子查询的 Microsoft Access 更新语句的主要内容,如果未能解决你的问题,请参考以下文章
数据库(比如MYSQL) ,表连结查询与子查询哪个效率高些? 为啥
我可以将 PIVOT 与 Microsoft SQL Server 中的内部联接结合起来吗?