【发布时间】: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 连接在一起以获得您需要的内容。