提问者:小点点

带子查询多个值的MySQL查询更新


我需要根据一个子查询的结果更新一个表,该子查询带来了1个以上的值,但在下面的查询中,我得到错误返回“subquery returns mouth 1 row”。我想知道是否有可能做一个“循环”,以更新值与我下面的子查询中呈现的每个结果。

完成查询

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

结果

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


共1个答案

匿名用户

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

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查询的每个结果。您可以在此链接中阅读更多相关内容