带有内部联接和子查询的 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 中的内部联接结合起来吗?

带有内部联接的 SQL 插入试图插入错误的列

Java JPA - 内部联接查询不起作用

在 HashMap 上具有内部联接的 HQL NamedQuery

带有内部联接的sql更新和位置