【问题标题】:linking child tables of two related parent-child tables链接两个相关父子表的子表
【发布时间】:2017-05-09 05:14:37
【问题描述】:

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

  1. Orders,一个包含 Orders 列表的表格,包括:Order Id, Supplier, Order Date 等。
  2. OrderDetails,一个 Table 包含已订购产品的列表,并且是 Orders 的子级,链接在 OrderId 上。关键字段是ProductId and the Quantity Ordered。每个订单都包含一个或多个 OrderDetails,其中概述了所订购的产品和数量。
  3. Shipments,一个包含 Shipments 列表的表格,包括 Tracking Number and Shipper。通过订单 ID 链接到订单。一个订单可能有多个发货。例如,我订购了 100 个灯泡。它们分 5 批发货。
  4. ShipmentDetails,包含产品和发货数量的列表,并通过 ShippingId 链接到 Shipments 表。每个 Shipment 可能有多个 ShipmentDetails。即,一批货物可能有 30 个灯泡和 10 个门把手。
  5. Products 是一个表格,其中包含需要订购和发货的产品列表。

所以逻辑是我在Products中输入有关要订购的产品的详细信息。例如,100 个 CREE LED 灯泡和 50 个门把手。

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

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

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

我正在努力弄清楚如何将运输详细信息记录与订单详细信息表相关联。假设运输明细表有 4 个字段。

  1. ShippingID - Shipments 父表的链接。
  2. TrackingNum - 包含跟踪号的字段。
  3. Product - 这应该是一个下拉菜单,表示我所属的货件与定义的订单相关(因为 ShipmentDetail 是 Shipment 记录的子记录,该记录又持有 Orders 表的键,而后者又具有引用产品的 OrderDetails)。
  4. Quantity - 这应该有一个默认(可覆盖)值,即 OrdersDetail 记录中与 Order Id 和 Product Id 匹配的“订购数量”数字。 OrderId 在 Shipments 表中(链接到 Orders 表),ProductID 来自上面的#3。它必须是可覆盖的原因是装运可能是分批装运。

我被前面的#3 和#4 卡住了。我希望我以一种模糊易懂的方式解释了这一点!下面的图片可能会有所帮助!

问:

  • ShipmentDetailsOrderDetail 表之间的正确连接是什么
  • 如何在 ShipmentDetail 表中使用从 OrderDetail 表的 Quantities 字段中提取的默认值创建一个字段,其中

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

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

【问题讨论】:

  • 请减少您的问题(即缩小问题),向我们展示表定义(每个定义一行),也许是一些示例数据,然后是您尝试生成的输出。

标签: sql ms-access


【解决方案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;

【讨论】:

    猜你喜欢
    • 2015-04-15
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多