繁体   English   中英

MySQL 查询更新与子查询多个值

[英]MySQL query update with subquery multiple values

我需要根据带来超过 1 个值的子查询的结果更新表,但是使用下面的查询我得到错误返回“子查询返回超过 1 行”。 我想知道是否可以创建一个“循环”来更新下面子查询中显示的每个结果的值。

完整查询

UPDATE estoque_tamanhos tam 
SET tam.qtde = tam.qtde - IF(NEW.tipo = 'K', NEW.qtde_prod * NEW.qtde_lote, NEW.qtde_prod)
WHERE tam.estoques_id = (SELECT estoques_id 
                         FROM combo_estoque 
                         WHERE produtos_id = NEW.produtos_id) 
  AND UPPER(tam.tamanho) = UPPER(NEW.tamanho_prod);

返回 2 个或更多值的子查询。

SELECT estoques_id FROM combo_estoque WHERE produtos_id = NEW.produtos_id

结果

produtos_id estoques_id
246 54
246 207

在理想情况下,我的查询将在第二个......第三个......之后执行第一个值,而不重复前面的值。

您应该使用游标创建一个存储过程来迭代查询的每个结果。

CREATE PROCEDURE UPDATING_ROWS(PRODUTO_ID INT, qtde_prod INT, qtde_lote INT, TIPO INT) 
BEGIN
   DECLARE done INT DEFAULT FALSE;
   DECLARE estoque_;
   DECLARE cursor FOR SELECT estoques_id FROM combo_estoque WHERE produtos_id = NEW.produtos_id) AND UPPER(tam.tamanho) = UPPER(NEW.tamanho_prod)
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

   OPEN cur1;
   read_loop: LOOP
      FETCH cur1 INTO estoque_;

      IF done THEN
         LEAVE read_loop;
      END IF;

      UPDATE estoque_tamanhos tam SET tam.qtde = tam.qtde - IF(TIPO = 'K', 
      qtde_prod * qtde_lote, qtde_prod)
      WHERE tam.estoques_id = estoque_;
   END LOOP;
END

您必须创建一个像这样的存储过程来迭代您的 select 查询的每个结果。 您可以在此链接中阅读有关此内容的更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM