使用MS Access从两个表中左外连接

时间:2014-11-17 13:58:38

标签: sql ms-access

我正在研究现有的Access数据库,尝试实施一些更改,以便估算我的雇主(我们制造飞行案例的工业公司)的切割时间。这应仅适用于某些类型的组件;我们有一个Stock表,其中包含每个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]

我的问题是,如果项目被列为" Panels"," Extrusions",&#34,我只想将切割时间应用于[Spec Components]中的项目;杂交"等(这是可以通过Stock.Category查询的信息),根据我们引用的项目类型使用不同的变量,例如Fabricated Lid Case的Panel可能需要18次切割但是一个不同的案例可能需要26.案件类型可以通过Specification.CaseType检索,并确定我们引用的案例类型。

最初我尝试使用SQL Query中嵌套条件语句的快速和脏解决方案来解决这个问题,但最终得到错误"查询过于复杂",因为嵌套数量有限制IFS。

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

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

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

我可以使用MS Access中的设计视图执行此操作: MS Access Design View

然而,当我运行查询时,我收到了这条消息,但我并不是真的理解它告诉我要做什么,或者我究竟应该如何分离查询,也许我就是这样。傻? Ambiguous Outer Joins

查询本身就是这样的:

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];

1 个答案:

答案 0 :(得分: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];