使用 MS Access 如何使用多个连接和 where 子句执行更新?

Posted

技术标签:

【中文标题】使用 MS Access 如何使用多个连接和 where 子句执行更新?【英文标题】:Using MS Access how to perform an update with multiple joins and where clauses? 【发布时间】:2014-06-05 20:16:57 【问题描述】:

我在让一些 MS Access SQL 工作时遇到了一些麻烦。这是高级别的:

我在一个表by15official 中有值,我需要使用它来更新另一个表investmentInfo 中的相关记录。非常简单,除了我需要执行很多连接以确保在investmentTable 中更新正确的记录,我想我可以使用常规 sql 来解决这个问题,但 Access 并不能很好地发挥作用。以下是我正在尝试使用的 sql(导致此错误:“查询表达式中的语法错误(缺少运算符)...”

update ii
set ii.investmentType = by15.InvestmentType
from investmentInfo as ii
inner join 
    (select by15Official.InvestmentType, by15Official.InvestmentNumber
     from (((by15official left join investmentinfo on by15official.InvestmentNumber = investmentInfo.investID) 
    left join fundingSources on fundingSources.investId = investmentInfo.id)
    left join budgetInfo on budgetInfo.fundingID = fundingSources.id)
    where investmentinfo.submissionType = 2
    and budgetInfo.byYear = 2015
    and budgetInfo.type = 'X') as by15
on by15.InvestmentNumber = ii.investID

这似乎应该可行,我正在尝试加入提供investmentType 的这组表,这是我想在主表investmentInfo 中更新的内容。想法?这可以在 Access 中完成吗?我四处搜索,发现上面的内容我适应了我的需求(实际上我很确定我在 SO 上找到了上面的内容)。

想法?

非常感谢!

【问题讨论】:

【参考方案1】:

我确实从 MS 论坛上的某个人那里得到了一些帮助。解决方案是稍微不同地格式化我的 SQL。这是最终起作用的代码。

UPDATE 
(
 (
   by15official LEFT JOIN investmentinfo 
   ON by15official.InvestmentNumber = investmentInfo.investID 
 )
 LEFT JOIN 
 fundingSources 
 ON investmentInfo.id = fundingSources.investId 
) 
LEFT JOIN budgetInfo 
ON fundingSources.id = budgetInfo.fundingID

SET investmentInfo.investmentType = by15official.InvestmentNumber

WHERE (investmentinfo.submissionType = 2)
And (budgetInfo.byYear = 2015)  

也许上面的Access SQL可以帮到别人。

基本上,您希望在执行 set 和 where 子句之前执行更新和连接。有道理,而且我敢肯定,如果我更擅长编写 SQL,我会知道的。

【讨论】:

【参考方案2】:

我知道这没有使用原始代码,但这是一个具有正确语法的通用示例:

UPDATE ([My First Table]
LEFT JOIN [My First Table] ON [My Second Table].[RequestID] = 
    [My First Table].[ID])
INNER JOIN [My Third Table] ON [My Second Table].[Some Field] = 
    [My Third Table].[Matching Field]
SET 
 [My First Table].[Approved By] = [My Third Table].[Approver], 
 [My First Table].[Approval Date] = [My Second Table].[Modified]
WHERE [My First Table].[Review Status] LIKE '*Approved*'

【讨论】:

【参考方案3】:

在 Access 中找出 SQL 中的联接的最简单方法是转到“查询设计”窗口,添加所需的表,然后单击“列”并将其拖动到要基于联接的表中。您对所有表格都执行此操作,然后您的连接就完成了。此外,如果您的连接变得过于复杂,这通常意味着存在数据库设计问题,尽管我知道在生产数据库中解决这个问题并不总是一种选择。祝你好运!

【讨论】:

感谢您的建议。查询设计窗口是一种选择,尽管我不是很喜欢使用它。并不是说它有什么问题,我刚刚习惯了编写自己的 SQL 并且设计窗口似乎过于分离。我很确定我拥有的一对多关系需要有很多连接。不过,我很欣赏你的评论。

以上是关于使用 MS Access 如何使用多个连接和 where 子句执行更新?的主要内容,如果未能解决你的问题,请参考以下文章

使用条件连接 MS Access/SQLQuery 中的多个表

MS Access 选择多个连接

如何使 ms access 数据库可供多个用户使用?

错误 3296:具有多个 JOIN 的 MS Access 查询中不支持连接表达式

如何在 Oracle 身份验证中使用 MS Access 连接字符串

如何使用 MySQl 的 ODBC 连接器在 MS Access 中的 VBA 中执行和查询?