【问题标题】:Using MS Access how to perform an update with multiple joins and where clauses?使用 MS Access 如何使用多个连接和 where 子句执行更新?
【发布时间】: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 上找到了上面的内容)。

想法?

非常感谢!

【问题讨论】:

    标签: sql ms-access-2010


    【解决方案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 并且设计窗口似乎过于分离。我很确定我拥有的一对多关系需要有很多连接。不过,我很欣赏你的评论。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-10
        • 2015-07-21
        • 2015-04-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多