链接两个相关父子表的子表

时间:2017-05-09 05:14:38

标签: sql ms-access

我有两个父子表和几个支持表。我正在努力找出他们之间的正确关系。

  1. 订单,一个包含订单列表的表格,包括:Order Id, Supplier, Order Date等。
  2. 订单详细信息,表格包含已订购的产品列表,并且是OrderId上链接的订单子项。关键字段是ProductId and the Quantity Ordered。每个订单包含一个或多个OrderDetails,其中概述了订购的产品和数量。
  3. 货件,一张包含货件清单的表格,包括Tracking Number and Shipper。通过订单ID链接到订单。订单可能有多个货件。例如,我订购了100个灯泡。他们分五次发货。
  4. ShipmentDetails ,包含产品和装运数量的列表,并通过ShippingId链接到Shipments表。每个货件可能有多个ShipmentDetails。即一批货可能有30个灯泡和10个门把手。
  5. 产品是一个表,其中包含需要订购和发货的产品列表。
  6. 因此,逻辑是我输入有关产品中订购的产品的详细信息。例如,100个CREE LED灯泡和50个门把手。

    当我下订单时,我在订单中创建订单。 i.e. amazon.com, order #45454.

    然后我在 OrderDetails 中将子行添加到该顺序。 i.e. 30 CREE LED Lightbulbs.

    当订单发货时,我在货件表中创建了一个条目。 i.e. Tracking #46464646464,与订单中的OrderId相关联。然后我在 ShipmentDetails 中输入该货件中的内容。例如,只有20或30个CREE LED灯泡可能与此运输条目相关联。

    我正在努力弄清楚如何将运输明细记录与订单明细表联系起来。让我们说运输明细表有4个字段。

    1. ShippingID - 发货表父母的链接。
    2. TrackingNum - 包含跟踪编号的字段。
    3. 产品 - 这应该是一个下拉列表,也就是说,我所属的货物与定义的订单相关(因为ShipmentDetail是货件记录的子货,而货件记录又持有订单表的一个关键字,而这又是有引用产品的OrderDetails。
    4. 数量 - 这应该具有默认(可覆盖)值,即"数量有序" OrdersDetail记录中与订单ID和产品ID匹配的编号。其中OrderId位于Shipments表中(链接到Orders表),ProductID来自上面的#3。它必须是可以覆盖的原因是货物可能是分批装运。
    5. 我被前面的#3和#4困住了。我希望我以一种模糊可理解的方式解释了这一点!下面的图片可能会有所帮助!

      问:

      • ShipmentDetails OrderDetail
      • 之间的正确连接是什么?
      • 如何在 ShipmentDetail 表格中创建一个字段,并从 OrderDetail 表的数量字段中提取默认值,其中

        Shipments!OrderId = Orders!Id and ShipmentDetail!ProductID = OrderDetails!Product ID
        

      我在MS Access 2016中工作 - 但我怀疑这是一个相当通用的SQL问题...而不是特定于MS Access。

      enter image description here enter image description here

      enter image description here

1 个答案:

答案 0 :(得分:1)

我认为命名令人困惑。

我宁愿拥有的是(每个第一个ID都是自动增量,忘记了如何在访问时说这个):

// Product doesn't contain any information about quantity/price etc ...
create table Products(product_id int, name text, description text ...);

// Orders:
create table Orders(order_id int, client_name text, description text ...);
create table OrderDetails(order_detail_id int, order_id int, product_id int, quantity double, unit_price double, ...);

// Shipments
create table Shipments(shipment_id int, company text, description text ...);
create table ShipmentDetails(shipment_detail_id int, shipment_id int, product_id int, quantity double, price double default 0, ...);

// inserting shipments per product (defaulting to total quantity per product), assuming we have shipment_id SID
insert into ShipmentDetails(shipment_id, order_id, product_id, quantity)
select SID, order_id, product_id, SUM(quantity)
from OrderDetails
group by order_id, product_id;

然后你当然可以有一些过滤器(日期,客户等......)。

对于第一个问题,我不清楚你想要什么样的回报。

以下是数量的比较:

select t.order_id, t.product_id, sum(t.quantity) as product_quantity, sum(u.quantity) as shipment_quantity
from OrderDetails t inner join ShipmentDetails u 
on t.order_id = u.order_id and t.product_id = u.product_id;