首页 > 解决方案 > 需要在循环中执行 SQL 查询的替代方法

问题描述

问题:我的客户的要求之一是接收来自客户的订单(存储在 txnorder 表中)并针对它们生成装箱单(存储在 txnpackingslip 表中)。现在有时包装的物品多于订购的物品,这不是问题,当我必须生成包装多于订单的报告时会出现问题(引用为负订单)。有1400多个客户,txnorder表每天更新300多行,txnpacking slip表每天更新250多行。MySQL 服务器集中在一个虚拟主机上。

我所做的:我已经编写了一个如下的存储过程,但是使用集中式服务器需要 90 多秒才能提取结果,而订单表的行数为 1600,packinslip 为 1400

存储过程: `

CREATE DEFINER=`root`@`localhost` PROCEDURE `NegativeOrders`(
    IN pcinput INT
    )
BEGIN
    SELECT 
    DISTINCT(o.ocode) AS "Code", 
    o.opcode, (o.obdl - IFNULL(p.pbdl,0)) AS "Req_Bdl", 
    (o.obox - IFNULL(p.pbox,0)) AS "Req_Box" 
    FROM 
        (SELECT DISTINCT(orderprdcode) AS ocode,
        orderpartycode AS opcode, (SUM(orderbdl)) AS obdl, 
        (SUM(orderbox)) AS obox 
        FROM txnorder WHERE orderpartycode = pcinput 
        GROUP BY orderprdcode) o 
    LEFT JOIN 
        (SELECT DISTINCT(packprodcode) AS pcode, 
        packpartycode AS ppcode, 
        (SUM(packbdl)) AS pbdl, 
        (SUM(packbox)) AS pbox 
        FROM txnpackingslip WHERE packpartycode = pcinput
        GROUP BY packprodcode) p 
    ON o.ocode = p.pcode  
    GROUP BY o.ocode 
    HAVING req_bdl < 0 OR req_box < 0;

    END$$

DELIMITER ;

这是创建的 SQL 小提琴:NegativeOrderFiddle

注意:除了优化我的 SQL 之外,我愿意采用任何相关的方法

标签: javamysqlswing

解决方案


推荐阅读