首页 > 解决方案 > 如何将选定的记录保存到变量中?

问题描述

我对以下查询有疑问..

在逐条记录插入表rtoxvta记录后,我需要在循环结束之前消除先前选择的vta表的记录。

为此,我声明了一个新变量并为其分配了 vta id ..但我在哪里做呢?

DROP PROCEDURE IF EXISTS ROWPERROW;
DELIMITER ;;

CREATE PROCEDURE ROWPERROW()
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE indexx INT DEFAULT 0;
#DECLARE aux INT DEFAULT 0;

SELECT COUNT(*) FROM rto INTO n;
SET n = n +1;
SET indexx=0;
WHILE indexx<n DO 

 INSERT INTO rtoxvta (fecharto, importerto, fechavta, importevta)
  SELECT r.fecha, r.importe, v.fecha, v.importe
    FROM vta v
    left outer join rto r 
    ON r.id = indexx
    WHERE v.fecha >= r.fecha
    AND (
    (v.importe = r.importe) OR 
    (v.importe + 2 = r.importe) OR  
    (v.importe + 1 = r.importe) OR 
    (v.importe - 1 = r.importe) OR 
    (v.importe - 2 = r.importe))
    LIMIT 1;

  SET indexx = indexx + 1;

  #DELETE FROM vta WHERE id = aux;

END WHILE;
End;
;;

CALL ROWPERROW();

标签: mysqlsql

解决方案


您必须分两步进行。首先获取要插入变量的记录的 ID,然后插入该记录。然后就可以删除记录了。

WHILE indexx<n DO 

  SELECT v.id, r.id INTO @v_id, @r_id
    FROM vta v
    join rto r 
    ON r.id = indexx
    WHERE v.fecha >= r.fecha
    AND r.importe BETWEEN v.importe - 2 AND v.importe + 2
    LIMIT 1;

 INSERT INTO rtoxvta (fecharto, importerto, fechavta, importevta)
 SELECT r.fecha, r.importe, v.fecha, v.importe
 FROM vta v
 CROSS JOIN rto r
 WHERE v.id = @v_id AND r.id = @r_id;

  SET indexx = indexx + 1;

  DELETE FROM vta WHERE id = @v_id;

END WHILE;

此外,如果您使用子句rto中的列WHERE,则应使用INNER JOIN而不是LEFT OUTER JOIN. 该WHERE条件将不匹配任何没有匹配 in 的行rto,因此使用外连接没有意义。


推荐阅读