首页 > 解决方案 > MS Access:将一张表的多个查询结果与同一张表的查询结果进行比较

问题描述

我正在构建一个 ms 访问数据库来管理混合物的零件编号。这几乎是一个材料清单。我有一个表,tblMixtures它在该PreMixture字段中引用自身。我进行了设置,以便混合物可以是另一种混合物中的预混合物,而后者又可以是另一种混合物中的预混合物,等等。每个PartNumberintblMixture都与许多Components intblMixtureComponents相关PartNumberComponents 及其相关数据存储在tblComponentData. 我在下表中输入了示例数据。

tblMixtures

零件号 描述 预混料
1 混合物 1 4, 5
2 混合物2 4、6
3 混合物 3
4 混合物 4 3
5 混合物 5
6 混合物 6

tblMixtureComponents

ID 零件号 零件 专注
1 1 一个 20%
2 1 40%
3 1 C 40%
4 2 一个 40%
5 2 30%
6 2 D 30%

tblComponentData

ID 姓名 密度 类别
1 一个 1.5
2 2 F
3 C 2.5
4 D 1 F

我已经构建了将最终混合物的信息汇总在一起所需的查询,甚至显示了用于每种混合物的预混合物和组分的详细信息。然而,实际上有数以万计的零件编号,用于混合物的预混合物可能有很多重叠。换句话说,Mixture 4可以用作Mixture 1等等Mixture 2的预混剂。我想构建一个查询来识别所有可能的混合物,这些混合物可以用作选定混合物中的预混合物。所以我想要一份与所选混合物具有相同成分或成分子集的所有混合物的列表。预混物不必具有混合物中的所有成分,但它不能具有任何不在混合物中的成分。

标签: ms-access-2016

解决方案


如果你还没有解决...

存储数据集合的 PreMixtures 列表明您需要进一步“规范化”您的数据库设计。如果您要从查询中获取预混合数据,则无需将其存储为表数据。如果您这样做了,每次您的混合物或组分发生变化时,您都将被迫更新预混料数据。

我们还需要说明 tblMixtures 没有 id 字段。考虑下表更改:

tbl混合:

ID 描述
1 混合物 1
2 混合物2
3 混合物 3

tblMixtureComponent:

ID 混合标识 组件标识
1 1 一个
2 1
3 1 C
4 2 一个
5 2
6 2 D
7 3 一个
8 4

我个人喜欢使用将主要关系暴露给外键关系的列命名。tblMixtures.id 显然与 tblMixtureComponenets.mixtureId 相关。我很懒,所以我也可能会缩写所有内容。

现在就查询而言,首先让我们获取混合物 1 的成分:

SELECT tblMixtureComponent.mixtureId, tblMixtureComponent.componentId
FROM tblMixtureComponent
WHERE tblMixtureComponent.mixtureId = 1

应该返回:

混合标识 组件标识
1 一个
1
1 C

我们可以将 WHERE 子句更改为我们想要的任何混合物的 id。接下来,我们需要获取所有带有不良成分的混合 ID。所以我们将建立一个连接来比较最后一个查询:

SELECT tblMixtureComponent.mixtureId
FROM tblMixtureComponenet LEFT JOIN
    (SELECT tblMixtureComponent.mixtureId, 
    tblMixtureComponent.componentId
    FROM tblMixtureComponent
    WHERE tblMixtureComponent.mixtureId = 1) AS GoodComp
ON tblMixtures.componentId = GoodComp.componentId
WHERE GoodComp.componentId Is Null

应该返回:

混合标识
2

太好了,所以现在我们有了所有我们不想要的混合物的 ID。让我们添加另一个连接来获得相反的结果:

SELECT tblMixture.id
FROM tblMix LEFT JOIN
    (SELECT tblMixtureComponent.mixtureId
    FROM tblMixtureComponenet LEFT JOIN
        (SELECT tblMixtureComponent.mixtureId, 
        tblMixtureComponent.componentId
        FROM tblMixtureComponent
        WHERE tblMixtureComponent.mixtureId = 1) AS GoodComp
    ON tblMixtures.componentId = GoodComp.componentId
    WHERE GoodComp.componentId Is Null) AS BadMix
ON tblMixtures.id = BadMix.mixtureId
WHERE BadMix.mixtureId = Null AND tblMixture.id <> 1

应该返回:

混合标识
3
4

剩下的是与混合物 1 具有相似成分但不具有不相似成分的所有 id。

对不起,我是在手机上做的...


推荐阅读