2014-11-17 88 views
0

我正在尝试实施一些现有Access数据库,这些更改将允许估计我的雇主(我们是制造飞行案例的工业公司)的裁剪时间。这只适用于某些类型的组件;我们有一个Stock表,其中包含每个库存项目的信息,包括它的类别。 A Specification用于建立估计/报价的表以及名为的表,其中包含附加到规范的库存项目清单。 Stock INNER JOIN [Spec Components] ON Stock.ID = [Spec Components].[Stock ID]使用MS Access从两个表中左外连接

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

我的问题是,我只是想,如果该项目被列为“板”,“挤出应用刀次项目中:

该表可如下加入“,”混合物“等(这是可以通过Stock.Category查询的信息),并且根据我们引用的物品的类型使用不同的变量,例如,制造盖盒的面板可能需要18次切割,但可能需要不同的情况要求26.案件类型是可以通过Specification.CaseType检索的东西,并确定哪种类型的cas我们正在引用。

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

什么我试图现在是使用一个单独的表包含了不同的切割/设置等的列表

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

然后我需要能够在适用情况下访问此表的内容,但仍然能够从我的其他表格中检索表格的内容不适用(对我来说,这表示需要在此表格上进行左外连接)。当我运行查询我得到这个消息 MS Access Design View

不过,但我真的不明白它告诉我做什么,或者如何在地球上:

我可以在MS Access做到这一点使用设计视图我应该分开查询,也许我很愚蠢? 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]; 
+0

如果规范最终会使用INNER JOINS返回库存,则不能使用从Cutting到Specification的LEFT OUTER JOINS。它使你的外部连接不明确。您可能需要设置两个单独的查询,然后将它们连接在一起以获取所需内容。 –

回答

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

谢谢!我可以看到你做了什么,这很好地解决了这个问题。此查询正被用作MS Access中数据表视图表单的数据源;我注意到现在已经实现了,用户无法通过数据表子表格从'[Spec Components]'中删除记录。 我导致认为这是由于存在子查询和/或有一个计算字段('TotalTime'),所以也许我将不得不添加一个新的控件/创建另一个查询,以允许用户要做到这一点。亲切的问候。 –

+0

我不使用MS Access,但我只能假设您的假设是正确的:子查询添加了一个图层,可能会阻止直接访问[Spec Components]进行删除。 – cooltea

+0

如果我可以帮忙,我也不会使用它!在开始新的桌面应用程序之前,我一直负责在此Access系统上实施一些修复/更改,这让我非常痛苦。再次感谢。 –