【问题标题】:Left Outer Joins from Two Tables using MS Access使用 MS Access 从两个表进行左外连接
【发布时间】:2014-11-17 23:18:19
【问题描述】:

我正在处理现有的 Access 数据库,试图实施一些更改,以便为我的雇主估算切割时间(我们是一家制造航空箱的工业公司)。这应该仅适用于某些类型的组件;我们有一个Stock 表,其中包含每个库存项目的信息,包括它的类别。一个Specification 表,用于构建估算/报价,以及一个名为[Spec Components] 的表,其中包含附加到规范的库存项目列表。

表格可以按如下方式连接:Stock INNER JOIN [Spec Components] ON Stock.ID = [Spec Components].[Stock ID]

Specification INNER JOIN [Spec Components] ON Specification.SpecID = [Spec Components].[Spec ID]

我的问题是我只想将切割时间应用于[Spec Components] 中的项目,如果该项目列为“面板”、“挤压”、“混合”等(可以通过 @987654329 查询的信息@) 并根据我们引用的项目类型使用不同的变量,例如,制造盖盒的面板可能需要 18 次切割,但不同的案例可能需要 26 次。案例类型可以通过 @987654330 检索@,并确定我们引用的案例类型。

最初我尝试使用 SQL 查询中嵌套条件语句的快速而肮脏的解决方案来解决这个问题,但最终得到错误“查询太复杂”,因为嵌套 if 的数量有限制。

我现在尝试的是使用一个单独的表格,其中包含不同剪辑/设置等的列表

Category | CaseType | Setups | Cuts | PCID
--------------------------------------------
Panels    | Lidmaker |  2     |  32  |    1
Panels    | Fab Lid  |  4     |  16  |    1
Extrusion | Lidmaker |  1     |  24  |    1

然后,我需要能够在适用的情况下访问该表的内容,但仍然能够从我的其他表中检索该表的内容不适用的值(对我来说,这表明需要用于此表的左外连接)。

我可以使用 MS Access 中的设计视图来做到这一点:

但是,当我运行查询时,我收到了这条消息,但我真的不明白它告诉我做什么,或者我到底应该如何分隔查询,也许我很傻?

查询本身是这样的:

SELECT [Spec Components].Qty, Specification.Height, Specification.Width, Specification.Depth, IIf(Cutting.Cuts>0 And Cutting.Setup>0,(Cutting.Cuts*Stock.CutTime)+(Cutting.Setup*Stock.SetupTime),0)
FROM ((Stock INNER JOIN [Spec Components] ON Stock.ID = [Spec Components].[Stock ID]) INNER JOIN Specification ON [Spec Components].[Spec ID] = Specification.SpecID) LEFT JOIN Cutting ON (Stock.Category = Cutting.Category) AND (Specification.[Case Type] = Cutting.CaseType)
ORDER BY [Spec Components].[Stock ID];

【问题讨论】:

  • 如果 Specification 最终使用 INNER JOINS 导致返回 Stock,则不能使用从切割到 Specification 的 LEFT OUTER JOINS。它使您的 OUTER JOINS 模棱两可。您可能需要设置 2 个单独的查询,然后将它们 LEFT JOIN 连接在一起以获得您需要的内容。

标签: sql ms-access


【解决方案1】:

编辑:Ambiguous left joins in MS Access的可能重复

关于错误信息,您可以通过以下链接找到更多信息:

要解决此问题,“您必须通过更改其中一个联接或将查询分成两个查询来指定应使用哪种方法。” (引自第二个链接)。

以下是使用子查询处理问题的方法。

SELECT
  Specified_Stock.Qty,
  Specified_Stock.Height,
  Specified_Stock.Width,
  Specified_Stock.Depth,
  IIf(
    Cutting.Cuts > 0 And Cutting.Setup > 0,
    (Cutting.Cuts * Specified_Stock.CutTime) + (Cutting.Setup * Specified_Stock.SetupTime),
    0
  )
FROM (
  SELECT
    [Spec Components].[Stock ID],
    [Spec Components].Qty,
    Specification.Height,
    Specification.Width,
    Specification.Depth,
    Stock.CutTime,
    Stock.SetupTime,
    Stock.Category,
    Specification.[Case Type]
  FROM Stock
  INNER JOIN [Spec Components] ON Stock.ID = [Spec Components].[Stock ID]
  INNER JOIN Specification ON [Spec Components].[Spec ID] = Specification.SpecID
) as Specified_Stock
LEFT JOIN Cutting ON (Specified_Stock.Category = Cutting.Category) AND (Specified_Stock.[Case Type] = Cutting.CaseType)
ORDER BY Specified_Stock.[Stock ID];

【讨论】:

  • 谢谢!我可以看到你做了什么,这很好地解决了这个问题。此查询用作 MS Access 中数据表视图表单的数据源;我注意到现在这已经实现,用户无法通过数据表子表单从[Spec Components] 中删除记录。我相信这是由于存在子查询和/或存在计算字段(TotalTime)所以也许我必须添加一个新控件/创建另一个查询以允许用户执行那。亲切的问候。
  • 我不使用 MS Access,但我只能假设您的假设是正确的:子查询添加了一层可能会阻止直接访问 [Spec Components] 以进行删除。
  • 如果我能帮上忙,我也不用它!在开始使用新的桌面应用程序之前,我的任务是在此 Access 系统上实施一些修复/更改,这让我非常痛苦。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多