postgresql - PostgreSQL - 使用 CURSORS 将 2 个 TABLES 的数量“分配”/“隔离”到第三个 TABLE
问题描述
我有以下 2 个表:
SALES_ORDERS此表包含特定项目的客户销售订单
DROP TABLE IF EXISTS "SALES_ORDERS";
CREATE TABLE "SALES_ORDERS" (
"SO" int4,
"ITEM" varchar(255),
"QTY" int4 );
INSERT INTO "SALES_ORDERS" VALUES (101, 'iPhone RED', 39);
INSERT INTO "SALES_ORDERS" VALUES (102, 'iPhone BLACK', 100);
INSERT INTO "SALES_ORDERS" VALUES (103, 'iPhone RED', 34);
INSERT INTO "SALES_ORDERS" VALUES (104, 'iPhone RED', 204);
INSERT INTO "SALES_ORDERS" VALUES (105, 'iPhone BLACK', 50);
WORK_ORDERS此表包含客户订单履行的计划订单
DROP TABLE IF EXISTS "WORK_ORDERS";
CREATE TABLE "WORK_ORDERS" (
"WO" int4,
"ITEM" varchar(255),
"QTY" int4 );
INSERT INTO "WORK_ORDERS" VALUES (5001, 'iPhone RED', 273);
INSERT INTO "WORK_ORDERS" VALUES (5002, 'iPhone BLACK', 50);
INSERT INTO "WORK_ORDERS" VALUES (5003, 'iPhone RED', 28);
INSERT INTO "WORK_ORDERS" VALUES (5004, 'iPhone BLACK', 100);
我正在寻找第三张表中列出的输出:
SALES_ORDER_FULFILLMENT此表根据第一个收到的客户订单和第一个计划工作订单分配工作订单数量与销售订单数量
DROP TABLE IF EXISTS "SALES_ORDER_FULFILLMENT";
CREATE TABLE "SALES_ORDER_FULFILLMENT" (
"SO" int4,
"SO_ITEM" varchar(255),
"SO_QTY" int4,
"WO" int2,
"WO_QTY" int4,
"WO_FULFILLED_QTY" int4,
"WO_REMAINING_QTY" int4,
"SO_DELTA" int4
);
INSERT INTO "SALES_ORDER_FULFILLMENT" VALUES (101, 'iPhone RED', 39, 5001, 273, 39, 234, 0);
INSERT INTO "SALES_ORDER_FULFILLMENT" VALUES (103, 'iPhone RED', 34, 5001, 273, 34, 200, 0);
INSERT INTO "SALES_ORDER_FULFILLMENT" VALUES (104, 'iPhone RED', 204, 5001, 273, 200, 0, 4);
INSERT INTO "SALES_ORDER_FULFILLMENT" VALUES (104, 'iPhone RED', 204, 5003, 28, 4, 24, 0);
INSERT INTO "SALES_ORDER_FULFILLMENT" VALUES (102, 'iPhone BLACK', 100, 5002, 50, 50, 0, 50);
INSERT INTO "SALES_ORDER_FULFILLMENT" VALUES (102, 'iPhone BLACK', 100, 5004, 100, 50, 50, 0);
INSERT INTO "SALES_ORDER_FULFILLMENT" VALUES (105, 'iPhone BLACK', 50, 5004, 100, 50, 0, 0);
我尝试使用 2 个 CURSORS 和 2 个 LOOPS 来获取一个 work_order,然后是同一项目的所有 sales_orders 并进行分配。
但是,我面临的问题是,当“work_order_qty”不足以满足特定的“sales_order”时,CURSOR 获取下一个“work_order”,前一个未完成的“sales_order”的引用丢失,因此分配开始再次。
这是我目前拥有的代码,请注意它不是当前代码或完整代码,我在此处列出仅供参考。
我确信这可能是一种更简单或更有效的方法。我也在寻找一些带有递归查询的解决方案,任何方向都会非常感激,谢谢。
CREATE OR REPLACE FUNCTION "SE"."WO_ALLOCATION"()
RETURNS "pg_catalog"."void" AS $BODY$
DECLARE
so_cur cursor for SELECT * FROM "SALES_ORDERS";
so_row "SALES_ORDERS"%rowtype;
so_qty integer;
so_delta integer;
wo_cur cursor for SELECT * FROM "WORK_ORDERS";
wo_row "WORK_ORDERS"%rowtype;
wo_qty integer;
wo_fulfilled integer;
wo_remaining integer;
FOR wo_row IN wo_cur LOOP
wo_fulfilled = 0;
wo_remaining = wo_row."QTY";
WHILE (wo_remaining > 0 ) LOOP
FOR so_row IN so_cur LOOP
so_qty = so_row."QTY";
IF (wo_remaining > so_qty) THEN
wo_fulfilled = so_qty;
wo_remaining = wo_remaining - wo_fulfilled;
so_delta = so_qty - wo_fulfilled;
END IF;
IF (wo_remaining < so_qty) THEN
wo_fulfilled = wo_remaining;
wo_remaining = wo_remaining - wo_fulfilled;
so_delta = so_qty - wo_fulfilled;
END IF;
INSERT INTO "SALES_ORDER_FULFILLMENT" VALUES(
so_row."SO",
so_row."ITEM",
so_row."QTY",
wo_row."WO",
wo_row."QTY",
wo_fulfilled,
wo_remaining,
so_delta);
END LOOP;
END LOOP;
END LOOP;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
解决方案
推荐阅读
- go - 设置 GOCACHE="on" 把一堆文件放在 on/ 目录下
- redux - 在哪里使用 Redux 和 sessionStorage?
- flutter - 检测用户是否离开 Flutter 中的当前页面?
- jquery - 当我通过 ajax POST 发送对象数组时,为什么 web.api 会获取空值?
- python - 将numpy数组垂直添加到自身
- python - 读取大文件中的每一行时出现内存错误
- android - Android Studio 无法解决:multidex 打开文件
- mysql - 在 excel VBA 上读取 SQL 并将值存储为变量。[运行时错误'-2147467259 (80004005)]
- wpf - WPF:在 Win10 平板电脑模式下在另一个之上打开应用程序
- javascript - JSON编码;了解 JSON.stringify(s).indexOf(s)?