首页 > 解决方案 > MS Access 可以跨超过 2 个表处理多个多对多关系吗

问题描述

我有 2 个类似的数据库,其中包含以下表格:

表 1 - 发票

表 2 - 发票行(中间 - 初级发票 -> 初级产品)

表 3 - 产品

表 4 - 服务(或产品 2)

我正在尝试建立多对多的关系。我了解一对多/一对多的中间表的需要。

问题是:对于 Invoices 表,我不仅需要与 products 表,还需要与 services 表(或与我的其他数据库的第二组 products 表)建立多对多关系。

我假设使用服务表数据库,我可以创建第二个中间表(发票-> 服务)但这不会创建 2 个单独的子表单相关表吗?而不仅仅是一个包含所有产品和所有服务的列表的相关子表单。

此外,如果发票只是来自 2 个不同产品表的产品列表(可能在两个产品表“prdA-xx”和“prdB-xx”上使用复合键,因此两者之间没有重复的主键表?)

我希望这两个问题都有一个解决方案?

虽然我可以合并 2 个单独的产品表,但由于每个表来自不同的供应商,每个表都有数千条记录,我需要将它们分开以满足不同的要求、一些不同的字段和规范化。

预期的解决方案将有一张发票,其中包含来自一个表的多个产品和来自第二个表的多个(服务或产品),如果可能的话,希望在一个相关的子表单中,因为所需的基本字段将是相同的:“desc, price, qty "

标签: ms-accessmany-to-many

解决方案


您可能对多对多关系的实际含义有误解。无论如何,这里是我将如何处理不同的产品表:我将使用 UNION 创建一个查询,这将使所有单独的表作为一个工作。简短的例子:

SELECT Supplier1ID AS ProductID, Supplier1ProductName AS ProductName, 'tblSupplier1' AS SourceTable, ThisFieldOnlyAppliesToSupplier1 FROM tblSupplier1
UNION
SELECT Supplier2ID AS ProductID, Supplier2ProductName AS ProductName, 'tblSupplier2' AS SourceTable, NULL AS ThisFieldOnlyAppliesToSupplier1 FROM tblSupplier2

您可以添加任何其他字段/表并将其保存为查询。唯一的问题是,如果 ProductID 可能在表之间发生冲突,那么您必须生成唯一 ID(可能为每个链接表添加一个短标识符作为前缀)


推荐阅读