我开始尝试熟悉MySQL中的存储过程。
我想知道是否可以逐步构建结果集 - 或者我是否需要使用临时表?
我的第一枪是
CREATE TEMPORARY TABLE t1 (id int);
INSERT INTO t1 VALUES (1), (2), (3), (4);
CREATE TEMPORARY TABLE t2 (id1 int, id2 int);
INSERT INTO t2 VALUES (5,4),(3,2),(1,0),(12,34);
DROP PROCEDURE IF EXISTS curdemo;
delimiter //
CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a INT;
DECLARE b,c INT;
DECLARE cur1 CURSOR FOR SELECT id FROM t1 LIMIT 1000;
DECLARE cur2 CURSOR FOR SELECT id1, id2 FROM t2 LIMIT 1000;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1;
OPEN cur2;
-- 1
REPEAT
FETCH cur1 INTO a;
FETCH cur2 INTO b, c;
IF NOT done THEN
SELECT a, b, c;
-- 2
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
CLOSE cur2;
-- 3
END
//
DELIMITER ;
这导致4个结果集,每个结果集包含一行。我想要的是一个包含4行的结果集。
所以我添加了
DROP TEMPORARY TABLE IF EXISTS tt;
CREATE TEMPORARY TABLE tt (id1 int, id2 int, id3 int);
INSERT INTO tt VALUES (a, b, c);
SELECT * FROM tt;
DROP TEMPORARY TABLE tt;
在适当的地方( - 1, - 2 - 替换SELECT和--3),它起作用了。
我现在的问题:还有其他办法吗?也许只声明我的结果集的形式然后逐行“生成”,而不需要临时表(及其临时存储分配)?
答案 0 :(得分:1)
您可以使用类似的连接组合两个选择:
SELECT id, id1, id2 FROM (
SELECT @rank:= @rank+1 as rank1, t1.id, t2.id1, t2.id2 FROM t1
STRAIGHT JOIN (SELECT @rank:= 1) r
LEFT JOIN (SELECT @rank as rank2, id1, id2 FROM t2 LIMIT 1000) s
ON (rank1 = rank2)
) s1