mysql - 如何将选定的记录保存到变量中?
问题描述
我对以下查询有疑问..
在逐条记录插入表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();
解决方案
您必须分两步进行。首先获取要插入变量的记录的 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
,因此使用外连接没有意义。
推荐阅读
- javascript - 重新格式化 json 数据中的字符
- html - Bootstrap 4 - 无法水平对齐垂直表单
- gerrit - 如何恢复由于 postgresql 数据库迁移而似乎已损坏的 gerrit 代码审查用户?
- javascript - 为什么在 V8 中使用此代码片段 <= 比 < 慢?
- html - ASP.NET 表单输入 - 宽度意外行为(未扩展 100%)
- typescript - 如何在打字稿中通过 websocket 接收浮点数据
- deep-learning - 将新字符导入基于深度学习的预训练 OCR 模型
- python - 使用烧瓶将数据插入或写入 .txt 文件
- swift - 在 Swift 中使用类创建命名空间
- c# - 配置存储已处置