【发布时间】:2019-05-21 14:43:12
【问题描述】:
我在 Postgres 数据库中有两个表,表示来自市场的简单订单。一个包含订单信息的主表和一个包含购买细节的详细表,外键返回到主表。很简单。
来自市场的数千个订单,我想根据购买的内容和数量找到一些特定的订单。
我还有两张桌子,以类似的方式,一个主人和一个孩子,我在其中创建一个“包装”并详细说明市场上的物品。
对于示例:包装 A 包含 2 个苹果和 3 个橙子。我在表格中定义。现在我想知道有多少订单,以及来自市场的哪些订单与该特定组合完全匹配。
精确匹配很重要。包含额外产品或任何不同数量的订单不匹配。
在 SQL Fiddle 中,我使用数据设置了简单示例。原始 DDL 如下。表中的两个订单应与 Pack A 匹配。
http://sqlfiddle.com/#!17/b4f55
CREATE TABLE customer_order(
order_id serial PRIMARY KEY NOT NULL,
customer_name VARCHAR(100) NOT NULL
);
CREATE TABLE order_detail(
id serial PRIMARY KEY,
order_id INTEGER,
item_sku VARCHAR(50),
item_quantity INTEGER,
FOREIGN KEY(order_id) REFERENCES customer_order(order_id)
);
INSERT INTO customer_order (customer_name) VALUES ('John');
INSERT INTO customer_order (customer_name) VALUES ('Mary');
INSERT INTO customer_order (customer_name) VALUES ('Bill');
INSERT INTO order_detail (order_id, item_sku, item_quantity) VALUES (1, 'APPLE', 2);
INSERT INTO order_detail (order_id, item_sku, item_quantity) VALUES (1, 'ORANGE', 3);
INSERT INTO order_detail (order_id, item_sku, item_quantity) VALUES (2, 'ORANGE', 5);
INSERT INTO order_detail (order_id, item_sku, item_quantity) VALUES (3, 'APPLE', 2);
INSERT INTO order_detail (order_id, item_sku, item_quantity) VALUES (3, 'ORANGE', 3);
CREATE TABLE pack_master(
pack_id serial PRIMARY KEY NOT NULL,
name VARCHAR(100) NOT NULL
);
CREATE TABLE pack_child(
id serial PRIMARY KEY,
pack_id INTEGER,
item_sku VARCHAR(50),
item_quantity INTEGER,
FOREIGN KEY(pack_id) REFERENCES pack_master(pack_id)
);
INSERT INTO pack_master (name) VALUES ('Pack A');
INSERT INTO pack_master (name) VALUES ('Pack B');
INSERT INTO pack_child (pack_id, item_sku, item_quantity) VALUES (1, 'APPLE', 2);
INSERT INTO pack_child (pack_id, item_sku, item_quantity) VALUES (1, 'ORANGE', 3);
INSERT INTO pack_child (pack_id, item_sku, item_quantity) VALUES (2, 'GRAPES', 5);
【问题讨论】:
-
能否请您以表格格式添加您的预期输出?
-
您的问题到底是什么?您想查找与 one 给定包装匹配的订单数量吗?还是为所有人?另请声明您的 Postgres 版本。
-
另外:
UNIQUE没有(pack_id, item_sku)约束,所以“Apples”可以在同一个包中多次出现?订单方面也一样?如果有,如何处理? -
我冒昧地做了一个小改动:
pack_master.pack_id而不是pack_master.id以使其保持一致。
标签: sql postgresql relational-division sql-match-all