我遇到以下问题的问题..
在记录中插入表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();
答案 0 :(得分:1)
你必须分两步完成。首先获取要插入变量的记录的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
条件与rto
中没有匹配的任何行都不匹配,因此使用外部联接没有意义。